【发布时间】: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