我目前有一個數據庫類,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