我目前有一个数据库类,PreparedStatement成员变量在构造函数中初始化。事情是这样的:Java多线程和连接池与PreparedStatement
public class Database
{
private Connection connection;
private PreparedStatement statement1, statement2, ...;
public Database(String url, String user, String pass)
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
connection = DriverManager.getConnection(url, user, pass);
statement1 = connection.prepareStatement("sql stuff");
statement2 = connection.prepareStatement("sql stuff");
// etc
}
public User getUser(int userId)
{
// execute getUser statement
}
// and other similar methods
}
该应用程序将是多线程的,我想用C3P0连接池。但我不知道如何去做。
比方说,我创建了一个数据库对象的每一个线程,并且构造现在得到从池中的连接。每个线程应该只调用其中一个方法(最多5个查询),然后结束。我是否每次都必须初始化所有准备好的语句?如果是的话,不会花太长时间吗?
有没有更好的方法可以做到这一点?
我不知道c3p0是否支持语句缓存,但有一些池可以。例如,[Tomcat JDBC池](https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html#org.apache.tomcat.jdbc.pool.interceptor.StatementCache)。有了这样的池,您可以重新使用准备语句的代码。如果像这样的语句已被缓存,则缓存的副本将被返回而不会产生实际准备语句的成本。 – Ralf
我刚刚检查并且c3p0确实有语句缓存。这是否意味着如果我在一个连接中准备语句,并且另一个线程稍后从池中获取另一个连接,那么这些语句将已经准备好了吗?或者他们是否必须为泳池中的每个连接做好准备? – dluga