2014-10-28 104 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

相關問題