2014-10-28 3 views
0

웹 응용 프로그램에서 연결 풀을 생성하기 위해 버전 0.9.2.1의 c3p0 라이브러리를 사용합니다. .. 627 302 밀리 초 전 성공적으로 서버에서받은 마지막 패킷 627 301 밀리 초 전에 마지막 패킷이 서버에 성공적으로 전송 된 것입니다 -MySQL 제한 시간이 만료 된 후 c3p0 연결이 예외를 throw합니다.

"HTTP 상태 500 : MySQL의 타임 아웃 후 나는 예외를 얻을 서버 의 값이 'wait_timeout'보다 작 으면 응용 프로그램에서 사용하기 전에 만료 또는 연결 테스트 유효성 검사, 클라이언트 시간 초과에 대한 서버 구성 값 증가 또는 Connector/J 연결 속성 사용 고려해야합니다. 'autoReconnect = true'로 설정하면이 문제를 피할 수 있습니다. "

JDBC URL에 autoReconnect 매개 변수를 추가하려고했지만 효과가 없습니다. 그래서, 그런 식으로 내 응용 프로그램에서 연결 풀을 사용

테스트를 위해 나는 코드의 다음 조각

c3p0.properties가

set @@global.wait_timeout=180; 

show global variables like "wait_timeout"; 

+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| wait_timeout | 180 | 
+---------------+-------+ 

추가 180 초로의 MySQL 아웃 (wait_timeout)을 설정 한

# 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(); 
    } 
} 
I는 DAOUtil.userDAO.find (ID)를 호출 할 때 상술 한 예외를 발생 7백45경1천5백15조5백36억9천1백36만3천2백10

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 인스턴스 MySQL의 만료 후에 아웃 (wait_timeout)

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 ini 파일을 변경할 수 없습니다.

답변

1

Dao 클래스의 연결을 닫고 데이터베이스에 대한 모든 요청에 ​​대해 연결 풀에서 새 연결을 요청하십시오. 연결이 스레드 안전하지 않기 때문에

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

는 그리고, 지역 변수로 사용하는 것이 더 객체 필드와 연결을 가지고 안전하지.

+0

덕분에 도움이되었습니다. 아직 한 가지 더 질문 : 각 쿼리가 끝난 후에 연결을 항상 닫으면 성능에 영향을 미칠 수 있습니까? – MarkHunt

+1

그 이유는 당신이 연결 풀을 사용하고 있습니다. 데이터베이스 연결을 설정하는 것은 비용이 많이 들지만 커넥션 풀은 이미 연결되어 있으며 그 중 하나만 사용하면됩니다. Connection에서 close()를 호출하면이 Connection은 풀로 돌아 왔고 다시 사용할 수 있습니다. – pomkine

+0

알았어요, 고마워요! – MarkHunt