繁体   English   中英

在Java中使用并发使用预准备语句

[英]Use of Prepared Statements using Concurrency in Java

我有一个应用程序,可以处理文件中的大量数据,并将这些数据放入数据库中。 它是单线程的; 所以我创建一个数据库连接,在该连接上创建准备好的语句,然后在处理数据时重用这些语句。 我可能会处理成千上万个文件,并且可以反复使用相同的准备好的语句,但只能更新值。 这一直很好,但是...

到了处理文件的时间太长的地步,由于它们都是独立的,因此我想同时处理它们。 问题在于每个文件可能使用10条准备好的语句。 因此,现在为每个文件建立一个新的数据库连接(即使它们已合并),设置这10条准备好的语句,然后关闭它们并为每个文件关闭连接。 因此,这发生了成千上万次,而不是以前的一次。

我实际上还没有进行任何计时,但是我很好奇这种连接和预备语句的使用是否是最佳方法吗? 一次又一次地准备这些准备好的陈述真的很昂贵吗? 有一个更好的方法吗? 我读到您不想共享线程之间的连接,但是也许有一个我没想到过的更好的解决方案?

如果使用连接和预备语句是最好的方法? 一次又一次地准备这些准备好的陈述真的很昂贵吗?

当然,您可以一次又一次地重复使用连接和准备好的语句。 您不必重新创建它们,对于连接,您当然不必每次都重新连接到数据库服务器。 您至少应该使用数据库连接池。 同样,您不能同时在多个线程中使用预处理语句。 而且我还认为,对于大多数数据库连接,您不能在不同的线程中使用相同的连接。

就是说,运行一些探查器可能是有意义的,因为线程化数据库代码通常提供最小的速度提高,因为您通常受数据库服务器IO而不是线程的限制。 如果您要混合查询,插入和事务,则可能不是这样。 如果您正在建立与数据库的远程连接,则可能会获得一些并发性。

为了提高数据库操作的速度,请考虑在进行大量事务之前禁止自动提交,或者如果可以的话,对请求进行批处理。

我建议您使用C3P0 API进行检查http://www.mchange.com/projects/c3p0/

增强性能是连接和语句池的目的,尤其是如果您要为每个客户端访问获取未池化的连接时,这是c3p0库的主要目标。

这部分取自C3P0 Doc,有关线程和重负载:

numHelperThreads和maxAdministrativeTaskTime帮助配置数据源线程池的行为。 默认情况下,每个数据源只有三个关联的帮助程序线程。 如果性能似乎在重负载下拖累,或者通过JMX或直接检查PooledDataSource观察到,“待处理任务”的数量通常大于零,请尝试增加numHelperThreads。 对于经历无限期挂起的任务和“ APPARENT DEADLOCK”消息的用户,maxAdministrativeTaskTime可能有用。

另外,我建议您在(java.util.concurrent)中使用ExecutorExecutorService来缓冲线程。

外观如下:

Executor executor = Executors.newFixedThreadPool(int numberOfThreadsNeeded);
// Executor executor =Executors.newCachedThreadPool(); // Or this one

executor.execute(runnable);
.
.
.
etc

暂无
暂无

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

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