2014-10-28 107 views
0

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

回答

1

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

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

而且它不是安全有连接的对象领域,更好地使用它作为一个局部变量,因为连接不是线程安全的。

+0

它帮助,谢谢!还有一个问题:如果我在每次查询后都会关闭连接,它会影响性能? – MarkHunt 2014-10-28 13:00:35

+1

那就是你使用连接池的原因。建立与数据库的连接非常昂贵,但连接池已经有连接,你只需要连接其中的一个。当您在Connection上调用close()时,此连接返回到池,您可以再次使用它。 – pomkine 2014-10-28 13:28:44

+0

明白了,谢谢! – MarkHunt 2014-10-28 16:02:54

相关问题