繁体   English   中英

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

[英]Improving performance for WRITE operation on Oracle DB in Java

我有一个典型的场景,需要了解最好的解决方法,所以就这样-

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

我在远程服务上拥有事件队列,该事件队列包含自上次检索以来已执行的INSERT / UPDATE / DELETE操作,并且一旦检索了最近15分钟的事件,它将再次添加事件以进行下一次检索。

现在,它只是将数据推送到Oracle,因此我所有的交互都是INSERT&UPDATE语句。

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

这将是一个可执行的jar文件,该文件将在操作后终止,并在下一个15分钟的周期内再次启动。

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

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

  • 连接到远程服务以获取事件。
  • 与DB创建连接(单个连接对象)。
  • 标识操作的类型(INSERT / UPDATE / DELETE)和完成操作的表。
  • 之后,根据操作和表的类型调用相应的方法。
  • 将Preparedstatement与位置参数一起使用,并从远程服务检索每个列值,并将其分配给语句参数。
  • 提交语句并返回以获取事件类以处理下一个事件。
  • 重复上述过程,直到处理完所有检索到的事件,然后程序关闭并在下一个周期开始,一切再次重复。

感谢帮助 !

如果您一次要插入或更新一行,则可以考虑执行批处理插入或批处理更新。 已经证明,如果尝试在一定数量后更新或插入行,则会获得更好的性能。

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

您应该分析应用程序,以了解它在哪里花费时间。 如果您不这样做,那么您将不知道下一步该如何优化,也不知道您所做的某些事情是否对您有所帮助或伤害。

如果可能的话,请尝试一次将所有事件带到远程服务器。

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

您应该通过使用连接池库来重用数据库连接,而不是为每个插入/更新/删除创建新的连接。 信不信由你,建立连接可能需要花费100倍以上的时间,只要拥有连接就可以进行数据库操作。

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

您应该考虑利用准备好的语句缓存。 这可能会有所帮助,但如果正确配置了Oracle,则可能没有帮助。

您应该考虑尝试分析您的操作以查找可以一起批处理的任何操作。 如果您有一些经常执行的“热”操作,则速度会更快。

“我有一个典型的场景”

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

因此,这是一个实验,您必须照此进行。 没有“最佳实践”。 尝试各种方法,看看最有效的方法。

“需要了解处理此问题的最佳方法”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM