使用PreparedStatement进行Java多线程和连接池

时间:2016-02-13 11:51:29

标签: java multithreading prepared-statement connection-pooling c3p0

我目前有一个Database类,其中PreparedStatement成员变量在构造函数中初始化。像这样:

install.package('abind')    
library(abind)

df <- abind(list(df1,df2), along = 3)
results <- apply(df, MARGIN = c(1,2), FUN = function(x) sum(x, na.rm = TRUE))
results

应用程序将是多线程的,我想使用c3p0进行连接池。但我不知道如何去做。

假设我为每个线程创建一个Database对象,构造函数现在从池中获取连接。每个线程应该只调用其中一个方法(最多5个查询),然后结束。我是否每次都要初始化所有准备好的陈述?如果是的话,不会花太长时间吗?

我有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您需要使用数据源,它提供了连接池的方法,然后您的应用程序从池中获取连接。

您可以在启动应用程序时创建像in this example这样的数据源程序,或者您可以从Web服务器控制台(取决于Web服务器)进行配置,然后通过JNDI在您的应用程序中获取数据源

预编译语句的预编译和数据库端缓存可以提高整体执行速度,并能够重用相同的SQL语句。

答案 1 :(得分:0)

连接池的一个优点是它重用现有连接,这是您当前实现不能做的事情。所以问题“每次初始化所有准备好的陈述不会花太长时间吗?”并不是真正相关,因为每次创建一个新的数据库连接很可能比每次初始化准备好的语句花费更长的时间。即使准备好的语句每次都被初始化并且从不重复使用,我怀疑你会注意到任何性能差异,因为执行数据库语句比初始化预准备语句需要更长的时间。

话虽这么说,大多数JDBC驱动程序都有一个缓存预准备语句的选项(即,这并不严格取决于连接池)。例如,参见MySQL配置选项herecachePrepStmtsprepStmtCacheSizeprepStmtCacheSqlLimit)。但请记住,这些优化是“很好的”,首先要确保您的程序在多线程场景中正常工作(例如,确保始终将从池中借用的连接返回到池中,即使在(运行时) )异常发生)并且是maintainable

相关问题