【问题标题】:java - jdbc performancejava - jdbc 性能
【发布时间】:2012-02-13 05:41:06
【问题描述】:

在 JDBC 性能优化方面,我需要你们的帮助。我们的 pojo 之一是使用 jdbc 连接到 oracle 数据库并检索记录。基本上,这些记录是电子邮件地址,基于哪些电子邮件将发送给用户。这里的问题是性能。这个过程每个周末都会发生,记录的数量非常庞大,大约 10 万条。

性能很慢,让我们很担心。似乎每 1 小时从数据库中提取 1000 条记录,这意味着这个过程需要 100 小时才能完成(这非常糟糕)。请帮我解决这个问题。

数据库服务器和java进程在两个不同的远程服务器上。我们使用了rs_email.setFetchSize(1000);,希望它会有所作为,但根本没有改变。 在服务器上执行的相同查询需要 0.35 秒才能完成。任何快速的建议都会对我们有很大帮助。

谢谢, 阿米尔。

【问题讨论】:

  • 当您说“远程服务器”时,您实际上是指“相距甚远的服务器”(就网络基础设施而言)还是仅仅意味着它们是两个独立的服务器(在同一个数据中心)?无论如何,这种表现应该发生。你只执行一个查询吗?
  • 请向我们展示这里正在执行的查询,也许还有一些该过程的伪代码。现在我们正在猜测问题。
  • 你确定 fetch 是慢点吗?您每小时仅获取 1000 行的事实引发了一个危险信号(对我而言),处理行的东西是阻塞点。
  • 另一个想法;您是否连接到数据库以获取每一行?一般来说,这是个坏主意。
  • 您确定问题出在从数据库中检索邮件地址,而不是 - 例如 - 发送电子邮件?过去,由于各种安全检查(来源、目的地、黑名单、反向 DNS 检查失败或速度慢等),我曾看到 SMTP 服务需要几秒钟才能发送一条消息。在您的示例中,处理一条消息需要 3.6 秒。我宁愿责备邮件的发送,也不愿归咎于数据库。

标签: java performance oracle jdbc


【解决方案1】:

首先查看您的查询。分析它们。看看是否可以使 SQL 更高效(即,向数据库询问您想要什么,而不是询问您不想要什么——这会产生很大的不同)。还要检查 where 和 join 子句中的任何字段是否有索引。索引有很大的不同。但它不能只是任何索引。它们必须是良好的索引(即,构成索引的字段为数据库提供足够的唯一性以适当地检索事物)。在这方面与您的 DBA 合作。查找针对 db 的高运行时间或检查 CPU 使用率高的查询(即使查询运行亚秒级)。这些是可以杀死您的数据库的东西。

同样从代码的角度来看,检查您是否正在打开和关闭您的连接,或者您是否正在重复使用它们。也可以带来很大的不同。

这将有助于发布您的代码、查询、表格布局和您拥有的任何索引。

【讨论】:

    【解决方案2】:

    使用log4jdbc获取真正的获取单条记录的sql。然后检查该sql的速度和计划。您可能需要适当的索引甚至数据库碎片整理。

    【讨论】:

      【解决方案3】:

      不确定 Oracle 驱动程序,但我知道 MySQL 驱动程序支持两种不同的结果检索方法:“流”和“等到你得到所有结果”。

      流式处理方法让您在获得查询返回的第一行时开始处理结果,而另一种方法在您开始处理之前检索整个结果集。在处理大量记录集的情况下,这通常会导致内存异常或性能下降,因为 java 达到了“内存屋顶”,而垃圾收集器无法像在流模式下那样丢弃“使用过的”记录。

      流模式不允许您以“正常”/“等到全部完成”模式的方式导航/滚动结果集...

      无论如何,不​​确定这是否有任何帮助,但可能值得一试。

      【讨论】:

      • 顺便...确保连接使用压缩。如果您不是从同一物理服务器检索结果,压缩通常可以带来相当大的性能提升。
      • 还有很多其他的东西,例如集群索引、使用物化查询表、分区数据,但我希望先获得低垂的果实。
      【解决方案4】:

      我对你的问题的回答,概括地说是: 1.检查网络 2.检查SQL 3.检查Java代码。

      听起来很慢。首先要检查的是您的网络是否较慢。您只需 ping 数据库服务器即可很快完成此操作。或者在与 JVMM 相同的机器上运行数据库服务器。如果不是网络,请为您的 SQL 制定解释计划,并确保在不需要时不进行表扫描。如果不是网络或 SQL,那么是时候检查您的 Java 代码了。你是否在不应该做的时候做阻塞之类的事情?

      【讨论】:

        猜你喜欢
        • 2017-07-02
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多