Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 建立连接时的JDBC性能_Java_Database_Performance_Jdbc_Database Connection - Fatal编程技术网

Java 建立连接时的JDBC性能

Java 建立连接时的JDBC性能,java,database,performance,jdbc,database-connection,Java,Database,Performance,Jdbc,Database Connection,我想减少部分项目的时间,目前需要2小时 它的编码方式是从一个表中取出将近700000个UID,并将其传递给16个不同的线程。然后,每个线程连接到JDBC并逐个获取UID的行。它运行700000个查询!每根线50k 因为它每行使用3到4个字段,所以我的计划是首先获取所需的字段,不再连接到数据库。 我关注的是: 因为它是通过UID获取一行的,所以我认为这应该很快,它会显著提高性能吗? 我需要担心内存和缓存未命中等问题,内存中有700000行和几个字段让我感到害怕。 总的来说,您认为这有助于提高性能,

我想减少部分项目的时间,目前需要2小时

它的编码方式是从一个表中取出将近700000个UID,并将其传递给16个不同的线程。然后,每个线程连接到JDBC并逐个获取UID的行。它运行700000个查询!每根线50k

因为它每行使用3到4个字段,所以我的计划是首先获取所需的字段,不再连接到数据库。 我关注的是:

因为它是通过UID获取一行的,所以我认为这应该很快,它会显著提高性能吗? 我需要担心内存和缓存未命中等问题,内存中有700000行和几个字段让我感到害怕。 总的来说,您认为这有助于提高性能,还是您认为这无关紧要。因为需要测试而节省5分钟,这是不值得的

那么你认为我应该走这条路还是更注重逻辑


非常感谢

正如在各种评论中建议的那样,您应该分批加载记录。我不知道您的基础设施是如何配置的,但是如果您使用的是云服务,那么数据库往返可能需要数百毫秒


然而,这可能不是你唯一的问题。如果您没有配置连接池,那么很可能是由于每个线程都在等待获取数据库连接,因此您的多线程没有获得任何好处。您的池大小应该考虑可以同时建立多少个连接。在这种情况下,如果我正确理解您的体系结构,那么17个可能是您的数字—主线程为1,工作线程为16

如果每一行的平均大小非常小,即可以在内存中容纳700000行,那么将该批选择到内存中,然后运行线程会快得多。如果每一行占用1K字节,您只需要大约700Mb的空间。700Mb对于内存来说是可以的,但我会得到一些缓存未命中。您能给我一个估计值吗,每个SQL运行多长时间才能获得一个UID已知的行?即使逐UID获取行非常快,您也不希望单独获取每一行。如果可能的话,每次都去拿两个。700000个查询太多了。@DraganBozanovic我不确定它是什么类型的缓存,但我确定它可以是700Mb!所以我知道我每次都会有一些缓存未命中,假设64倍的64k缓存插槽,每行1k,因为我不知道从DB中获取一行需要多长时间,我不知道这是否值得!您是否使用JDBC连接池框架,例如dbcp等。?如果不是,你应该考虑一下。如果是这样的话,您是否有足够大的池,可以从16个线程中获得并发优势?虽然这不是问题答案的一部分,我建议您通过让主服务器线程读取记录块,然后将行多路传输到线程进行处理,而不是让每个线程单独读取行,从而实现更好的性能。这也是我的想法,但最终需要进行大量更改和编码。我们使用BasicDataSource,您知道它在需要时是否会创建更多连接,还是会坚持使用initialsize?谢谢,默认值是最大8thanks@Mars,正如您已经发现的,默认情况下,8是最大连接数,假设您使用的是听起来像您的DBCP BasicDataSource。考虑到您使用的是一个连接池,尽管配置可能有点不足,但我认为如果您想实现显著的性能提升,您需要重新构建您的解决方案。