웹 응용 프로그램에서 연결 풀을 생성하기 위해 버전 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 파일을 변경할 수 없습니다.
덕분에 도움이되었습니다. 아직 한 가지 더 질문 : 각 쿼리가 끝난 후에 연결을 항상 닫으면 성능에 영향을 미칠 수 있습니까? – MarkHunt
그 이유는 당신이 연결 풀을 사용하고 있습니다. 데이터베이스 연결을 설정하는 것은 비용이 많이 들지만 커넥션 풀은 이미 연결되어 있으며 그 중 하나만 사용하면됩니다. Connection에서 close()를 호출하면이 Connection은 풀로 돌아 왔고 다시 사용할 수 있습니다. – pomkine
알았어요, 고마워요! – MarkHunt