【发布时间】:2016-05-24 14:22:51
【问题描述】:
我目前有一个 Database 类,其中 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 pool。使用这样的池,您可以重用准备语句的代码。如果已经缓存了类似的语句,则将返回缓存的副本,而不会产生实际准备语句的成本。
-
我刚刚检查过,c3p0 确实有语句缓存。这是否意味着如果我在一个连接中准备语句,而另一个线程稍后从池中获得另一个连接,则语句将已经准备好?还是他们必须为池中的每个连接做好一次准备?
标签: java multithreading prepared-statement connection-pooling c3p0