【发布时间】:2014-12-23 16:52:45
【问题描述】:
我使用版本 0.9.2.1 的 c3p0 库在 Web 应用程序中创建连接池。 MySQL超时后我得到异常:
"HTTP 状态 500 - 成功接收到的最后一个数据包 服务器是 627 301 毫秒前。最后一个数据包发送成功 到服务器是 627 302 毫秒前。比服务器长 'wait_timeout' 的配置值。你应该考虑 在您使用之前过期和/或测试连接有效性 应用程序,增加客户端的服务器配置值 超时,或使用 Connector/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 文件。
【问题讨论】:
标签: java mysql connection-pooling c3p0