我正在使用一个应用程序,该应用程序在每次使用特定设备时都会将进程数据(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/