我正在使用一个应用程序,该应用程序在每次使用特定设备时都会将进程数据(processName,processID,sessionStart,sessionEnd,computerName,currentUser)保存到数据库中。

我的问题是一次又一次地添加数据过程(按照可运行任务中的指定每4秒一次),因此我遇到了很多类似的行,我想找到一个解决方案,只需添加一次,然后在停止使用设备时再添加一次sessionEnd datetime。我的代码如下:

if(found){
    while(found == true){
        System.out.println("\nALERT! Device in use!\nThe process currently using the device is: \n" + strLineProcess+"\n");

        final String regex = "^(\\S+) pid: (\\d+) ([^\\\\s]+)\\\\(.+)";
        final String processDetails = strLineProcess;
        String processName = null;
        String processID = null;
        String computerName = null;
        String currentUser = null;


        final Pattern pattern = Pattern.compile(regex);
        final Matcher matcher = pattern.matcher(processDetails);

        if (matcher.find()) {
            processName = matcher.group(1);
            processID = matcher.group(2);
            computerName = matcher.group(3);
            currentUser = matcher.group(4);
        }

        //Array containing all the process data
        String[] processData = new String[6];

        processData[0]=""+processName;
        processData[1]=""+processID;
        processData[2]=getDateTime();
        processData[3]="";
        processData[4]=""+computerName;
        processData[5]=""+currentUser;

        String[] processRepeated = new String[1];


        insert.insertRow(processData);

        break;
    }
}


我虽然要从应用程序中进行选择,但要检查processID是否与我要插入的那个相同,如果是,则什么也不做,但是我发现这有点笨拙,因为所有这一切都需要发生每4秒。只是无法绕开它!

为了澄清起见,strLineProcess包含一个类似于以下的字符串:Skype.exe pid:3068 WATCHOUT \ tofetopo,我用正则表达式将其除以将每个值添加到其对应的变量中。

最佳答案

根据您提供的信息还不清楚,但是可以简单地通过在除datetime列之外的所有列上添加唯一索引来解决问题吗?

下一个最简单的尝试是在数据库中搜索已经存在的行。每4秒钟或每4毫秒发生一次就没有问题,建议从最简单的解决方案开始,并且仅在简单的解决方案确实引起问题时才提供更特殊的解决方案。

奇异的解决方法是在内存中维护一个列表,缓存最近X秒钟内看到的所有行,并在插入新行之前搜索该列表中的重复项。每次您遍历列表时,都将丢弃任何太旧且不再引起关注的条目。

关于java - 如何阻止Java应用程序在数据库中插入相同的值-SQL Server,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43396693/

10-11 00:34
查看更多