java-jdbc性能

java-jdbc性能,java,performance,oracle,jdbc,Java,Performance,Oracle,Jdbc,关于JDBC性能优化,我需要你们的帮助。我们的一个pojo是使用jdbc连接到oracle数据库并检索记录。基本上,这些记录是电子邮件地址,根据这些地址将电子邮件发送给用户。这里的问题是性能。这个过程每个周末都会发生,记录数量非常庞大,大约10万张 演出很慢,我们很担心。似乎每1小时只从数据库中提取1000条记录,这意味着这个过程需要100小时才能完成(这是非常糟糕的)。请帮我做这个 数据库服务器和java进程位于两个不同的远程服务器中。我们使用了rs_email.setFetchSize(10

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

演出很慢,我们很担心。似乎每1小时只从数据库中提取1000条记录,这意味着这个过程需要100小时才能完成(这是非常糟糕的)。请帮我做这个

数据库服务器和java进程位于两个不同的远程服务器中。我们使用了
rs_email.setFetchSize(1000)
谢谢,

Aamer.

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

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


发布您的代码、查询、表布局和所有索引都会有所帮助。

用于获取获取单个记录的真实sql。然后检查sql的速度和计划。您可能需要一个适当的索引,甚至需要对数据库进行碎片整理。

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

流方法允许您在从查询返回第一行时就开始处理结果,而另一种方法则在您开始处理结果集之前检索整个结果集。在处理大型记录集的情况下,这通常会导致内存异常或性能降低,因为java达到了“内存上限”,垃圾收集器不能像在流模式中那样丢弃“已用”的记录

流模式不允许您以“正常”/“等待,直到您获得全部”模式的方式导航/滚动结果集


无论如何,我不确定这是否有帮助,但它可能值得一看。

我对你的问题的回答,总结如下: 1.检查网络 2.检查SQL 3.检查Java代码


听起来很慢。首先要检查的是网络是否运行缓慢。只需ping数据库服务器,就可以很快做到这一点。或者在与JVMM相同的计算机上运行数据库服务器。如果不是网络,请为SQL制定一个解释计划,并确保在不需要的时候不进行表扫描。如果不是网络或SQL,那么是时候检查Java代码了。你是不是在做一些不该做的事情,比如拦网

当你说“远程服务器”时,你实际上是指“相距遥远的服务器”(就网络基础设施而言),还是仅仅指它们是两个独立的服务器(在同一个数据中心)?这种表演无论如何都不应该发生。您是否只执行一个查询?请向我们展示此处正在执行的查询以及流程的一些伪代码。现在我们正在猜测问题所在。您确定提取是慢点吗?事实上,您每小时只能获取1000行数据,这让我意识到处理这些行的东西是瓶颈;是否连接到数据库以获取每一行?一般来说,这不是一个好主意。您确定问题是从数据库中检索邮件地址,而不是发送电子邮件吗?在过去,由于各种安全检查(来源、目的地、黑名单、失败或缓慢的反向DNS检查等),我看到SMTP服务需要几秒钟才能发送一封邮件。在您的示例中,处理单个消息需要3.6秒。我宁愿把责任归咎于邮件的发送,而不是数据库。顺便说一句……确保连接使用压缩。在不从同一台物理服务器检索结果的情况下,压缩通常可以提供相当好的性能提升。还有很多其他方面,如聚类索引、使用具体化的查询表、对数据进行分区,但我首先要考虑的是低挂果。