提高Java中Oracle DB上WRITE操作的性能

时间:2014-05-28 21:23:57

标签: java sql oracle soap jdbc

我有一个典型的场景&需要了解处理这个问题的最佳方法,所以在这里 -

我正在开发一种解决方案,该解决方案将从基于SOAP的远程Web服务&然后将此数据推送到网络上的Oracle数据库。 此外,这将是一个每15分钟执行一次的计划任务。

我在远程服务上有事件队列,其中包含自上次检索以来已完成的INSERT / UPDATE / DELETE操作,&一旦我检索了最近15分钟的事件,它再次添​​加事件以供下次检索。

现在,它只是将数据推送到Oracle,所以我的所有交互都是INSERT&更新声明。

Oracle上有大约60个表,其中一些表有100多列。此外,每15分钟循环一次,将有大约60-70个插入,100多个更新& 10-20删除。

这将是一个可执行的jar文件,它将在操作后终止。将在接下来的15分钟周期内再次开始。

所以,我需要了解如何处理WRITE操作(最佳实践)以提高整个应用程序的性能?

当前测试代码(每个周期) -

  • 连接远程服务以获取活动。
  • 与DB(单个连接对象)建立连接。
  • 标识操作类型(INSERT / UPDATE / DELETE)&完成它的表。
  • 之后,根据操作类型调用相应的方法&表
  • 使用具有位置参数的Preparedstatement,&从远程服务检索每个列值&将其分配给语句参数。
  • 发表声明&返回以获取事件类来处理下一个事件。
  • 重复上述步骤直到处理完所有检索到的事件,之后程序关闭并且然后从下一个周期开始&一切都重复了。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

如果您一次插入或更新一行,可以考虑执行批量插入或批量更新。事实证明,如果您尝试在一定数量之后更新或插入行,则可以获得更好的性能。

答案 1 :(得分:0)

您正在谈论的数据库操作数量(每15分钟200个)很小,很容易在不到15分钟内完成。一些具体的建议:

您应该分析您的应用程序,以了解它花费时间的位置。如果你不这样做,那么你不知道下一步要优化什么,你不知道你做了什么帮助或伤害。

如果可能,尝试将所有事件一次性到达远程服务器。

您应该重用与远程服务的连接(可能通过使用支持连接持久性和重用的库)。

您应该使用连接池库重用数据库连接,而不是为每个插入/更新/删除创建新连接。信不信由你,一旦掌握了连接,创建连接可能需要100倍于数据库操作。

您应该考虑在同一事务中执行多个(或全部)数据库操作,而不是为每个已更改的行创建新事务。但是,您应该仔细考虑您的失败模式,以免丢失任何事件(如果这是一个重要的考虑因素)。

您应该考虑使用预准备语句缓存。这可能会有所帮助,但如果Oracle配置正确,可能不会。

您应该考虑尝试分析您的操作,以找到可以一起批处理的任何操作。如果您经常进行一些“热门”操作,这可以快得多。

答案 2 :(得分:0)

  

"我是一个典型的场景"

不,你没有。您拥有定制的架构,具有独特的数据模型,独特的数据和独特的业务需求。这不是一件坏事,它几乎是每个计算机系统都没有现成的(甚至其中一些)。

所以,这是一个实验,你必须这样做。没有"最佳实践"。尝试各种各样的事情,看看什么最好

  

"需要了解处理此问题的最佳方式"

通过雇用了解Oracle数据库的人,您将极大地提高成功的机会。