我使用版本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