高效的日志系统 - Java / Oracle SQL

时间:2011-10-27 03:08:31

标签: java oracle logging

所有

我必须重新设计在Web应用程序中使用的现有日志记录系统。现有系统读取Excel工作表以进行记录,处理(数据验证),一旦发现错误就将Excel工作表中每个条目的错误消息记录到数据库中,并在结尾显示所有记录的结果。所以,

如果excelsheet中有2条记录,R1和R2都失败,每条记录都有3个验证错误,则每个验证消息都会触发6次插入查询,并且用户在验证过程结束时会看到所有6条消息。

此方法适用于较小的条目集。但是对于20,000条记录来说,这显然已成为瓶颈。

根据我最初的重新设计方法,以下是我需要向SO大家提出建议的选项:

1>创建一个自定义记录器类,其中包含记录所需的所有信息以及错误的每个记录,将记录ID作为键存储,将Logger类对象作为值存储在HashMap中。完全处理完所有记录后,一次性对HashMap中的所有记录执行数据库插入。

2 - ; Fire SQL定期插入,即总共X个记录,每次处理Y< = X记录,执行一次插入操作。并再次处理剩余的记录。

除了明确提高性能外,我们目前还没有设定标准。

每个人都可以提供您的反馈,了解有效的测井系统设计,以及是否有比上面提到的更好的方法?

2 个答案:

答案 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();