我使用版本0.9.2.1的c3p0库在Web应用程序中创建连接池。MySQL超时后,我得到异常:
“ HTTP状态500-从服务器成功收到的最后一个数据包是627301毫秒之前。成功发送到服务器的最后一个数据包是627302毫秒之前。比服务器配置的'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文件。
尝试关闭您的Dao类中的连接,并为对数据库的每个请求从连接池中请求一个新的连接。
Connection con;
try {
con=DBConnectionUtil.getConnection();
//some code here
} finally {
if(con!=null){
con.close();
}
而且,将Connection作为对象字段是不安全的,最好将其用作局部变量,因为Connection不是线程安全的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句