我使用版本0.9.2.1的c3p0庫在Web應用程序中創建連接池。 MySQL的暫停過後,我得到異常:。在MySQL超時過期後,c3p0的連接拋出異常
「HTTP狀態500 - 從 服務器成功接收到的最後一個包是627 301毫秒前的最後一個數據包成功 發送到服務器爲627 302毫秒以前是比「WAIT_TIMEOUT」的服務器 配置值長。你應該考慮要麼 到期和/或在您的 應用程序使用之前測試連接的有效性,增加了服務器的配置值,客戶 超時,或使用連接器/ J連接屬性 'autoReconnect = true'來避免這個問題。「
我試着追加一個autoReconnect參數給JDBC url,但是也沒有效果。所以,在這種方式,我使用連接池在我的應用程序:
爲了測試我設置的MySQL WAIT_TIMEOUT到180秒
set @@global.wait_timeout=180;
show global variables like "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 180 |
+---------------+-------+
,並進一步有下一個代碼段
c3p0.properties
# JDBC paramters are ommited
# Basic pool configuration
c3p0.initialPoolSize=5
c3p0.minPoolSize=5
c3p0.maxPoolSize=50
c3p0.acquireIncrement=5
# Managing connection age
c3p0.maxConnectionAge=100
c3p0.maxIdleTime=90
# Configuring connection testing
c3p0.idleConnectionTestPeriod=30
c3p0.testConnectionOnCheckin=true
c3p0.preferredTestQuery=SELECT 1
DBConnectionUtil.java
public class DBConnectionUtil {
// initialized through c3p0.properties
private static ComboPooledDataSource ds = new ComboPooledDataSource();
public static ComboPooledDataSource getConnectionPool() {
return ds;
}
public static void destroyConnectionPool() {
ds.close();
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
UserDAO.java
public class UserDAO {
private Connection connection;
public UserDAO() throws SQLException {
connection = DBConnectionUtil.getConnection();
}
public User find(Integer id) throws SQLException {
User user = null;
PreparedStatement ps = connection.prepareStatement("SELECT * FROM `USERS` WHERE ID = ?");
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
user = new User();
user.setId(rs.getInt("ID"));
user.setName(rs.getString("NAME"));
user.setUsername(rs.getString("USERNAME"));
user.setPassword(rs.getString("PASSWORD"));
user.setParentId(rs.getInt("PARENT_ID"));
}
rs.close();
ps.close();
return user;
}
}
DAOUtil.java
public class DAOUtil {
private static UserDAO userDAO;
public static UserDAO getUserDAO() {
return userDAO;
}
static {
try {
userDAO = new UserDAO();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
過期的MySQL WAIT_TIMEOUT之後,例如,當我打電話DAOUtil.userDAO.find(ID)它拋出其上述異常。
你能幫我瞭解我做錯了嗎? 注意:我無法更改MySQL ini文件。
它幫助,謝謝!還有一個問題:如果我在每次查詢後都會關閉連接,它會影響性能? – MarkHunt 2014-10-28 13:00:35
那就是你使用連接池的原因。建立與數據庫的連接非常昂貴,但連接池已經有連接,你只需要連接其中的一個。當您在Connection上調用close()時,此連接返回到池,您可以再次使用它。 – pomkine 2014-10-28 13:28:44
明白了,謝謝! – MarkHunt 2014-10-28 16:02:54