所有
我必须重新设计在Web应用程序中使用的现有日志记录系统。现有系统读取Excel工作表以进行记录,处理(数据验证),一旦发现错误就将Excel工作表中每个条目的错误消息记录到数据库中,并在结尾显示所有记录的结果。所以,
如果excelsheet中有2条记录,R1和R2都失败,每条记录都有3个验证错误,则每个验证消息都会触发6次插入查询,并且用户在验证过程结束时会看到所有6条消息。
此方法适用于较小的条目集。但是对于20,000条记录来说,这显然已成为瓶颈。
根据我最初的重新设计方法,以下是我需要向SO大家提出建议的选项:
1>创建一个自定义记录器类,其中包含记录所需的所有信息以及错误的每个记录,将记录ID作为键存储,将Logger类对象作为值存储在HashMap中。完全处理完所有记录后,一次性对HashMap中的所有记录执行数据库插入。
2 - ; Fire SQL定期插入,即总共X个记录,每次处理Y< = X记录,执行一次插入操作。并再次处理剩余的记录。
除了明确提高性能外,我们目前还没有设定标准。
每个人都可以提供您的反馈,了解有效的测井系统设计,以及是否有比上面提到的更好的方法?
答案 0 :(得分:2)
我猜你的问题是由于你正在进行基于行的操作,而不是基于设置?
基于集合的操作将是加载数据的最快方法。如果那是不可能的话,我会一次使用insert x记录,因为它更具可伸缩性,一次插入它们需要不断增加的内存量(但可能会更快)。
在这里讨论问汤姆:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1583402705463
答案 1 :(得分:1)
您可以尝试(在DBMS支持的情况下)将所有这些插入语句一起批处理并在最后触发它,而不是记住HashMap中的每个错误。有点像这样:
PreparedStatement ps = connection.prepareStatement("INSERT INTO table (...) values (?, ?, ...)");
for(...) {
ps.setString(1, ...);
...
ps.addBatch();
}
int[] results = ps.executeBatch();