0
Oracle 데이터베이스에 연결하기 위해 다음 코드를 작성했습니다. 이것은 REST API에 사용되고 있습니다. 연결하려는 데이터베이스에 IDLE_TIME 매개 변수가 30 분으로 설정되어 있습니다 (변경할 수 없음). 데이터베이스 연결이 30 분 이상 유휴 상태이면 "java.sql.SQLRecoverableException : Closed Connection"오류가 발생합니다. 이 오류가 발생하면 API가 작동을 멈 춥니 다. 이 문제를 어떻게 해결할 수 있습니까?Oracle DB에 대한 JDBC 연결을 닫는 방법 (SQLRecoverableException Closed Connection)?
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Properties;
import java.util.Queue;
import java.util.ResourceBundle;
import java.sql.SQLRecoverableException;
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;
public class OrcConnector {
private Queue<Connection> connections;
private int maxConnections;
private static final int MAX_CONNECTIONS_DEFAULT = 10;
public OrcConnector() {
connections = new LinkedList<Connection>();
maxConnections = MAX_CONNECTIONS_DEFAULT ;
}
public synchronized int getMaxConnections(){
return maxConnections;
}
public synchronized void setMaxConnection (int maxConnections) {
this.maxConnections = maxConnections;
}
public synchronized ConnWrapper getConnection() throws SQLException, BusyConnections {
Connection availConn;
System.out.println("I am in OrcConnection");
if (connections.size() > 0) {
availConn = connections.poll();
} else if (connections.size() < maxConnections) {
Properties prop = new Properties();
ResourceBundle resource = ResourceBundle.getBundle("database");
String url = resource.getString("db.url");
String user = resource.getString("db.user");
String pass = resource.getString("db.password");
prop.put("user", user);
prop.put("password", pass);
prop.put("autoReconnect", "true");
prop.put("characterEncoding", "UTF-8");
prop.put("useUnicode", "true");
availConn = DriverManager.getConnection(url,user,pass);
System.out.println("I am in OrcConnection");
} else {
throw new BusyConnections();
}
return new ConnWrapper(availConn, this);
}
public synchronized void putConnection(Connection conn) {
if (conn != null) {
if (connections.size() < maxConnections) {
connections.add(conn);
} else {
try {
conn.close();
} catch (SQLException e) {
System.out.println("connection could not be closed" + e.getMessage());
}
}
}
}
}
SQLRecoverableException을 catch하고 연결을 다시 시도하는 시도가 작동하지 않았습니다. – user3357381
일부 옵션 : 1. 웹 컨테이너를 사용하여 연결 (및 연결 풀)을 관리합니다. 2. 연결을 재사용하지 마십시오. 필요할 때만 열고 완료되면 닫습니다. 3. 권장 사항은 아니지만 옵션 : 타이머를 사용하여 데이터베이스를 정기적으로 ping하여 시간 초과를 방지하십시오. – copeg
자체 연결 풀을 작성하지 마십시오. 기존 것을 사용하십시오. 생각하는 것처럼 단순하지 않습니다. – EJP