MySQL超时到期后,c3p0的连接抛出异常

时间:2014-10-28 10:16:12

标签: java mysql connection-pooling c3p0

我使用版本0.9.2.1的c3p0库在Web应用程序中创建连接池。 MySQL超时后我得到异常:

  

“HTTP状态500 - 从中​​成功接收的最后一个数据包   server was 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文件。

1 个答案:

答案 0 :(得分:1)

尝试关闭Dao类中的连接,并为每个数据库请求从连接池中请求新连接。

Connection con;
try {
  con=DBConnectionUtil.getConnection();
  //some code here
} finally {
  if(con!=null){
      con.close();
  } 

将Connection作为对象字段并不安全,最好将其用作局部变量,因为连接不是线程安全的。