2016-09-22 2 views
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()); 
       } 
      } 
     } 
    } 


} 
+0

SQLRecoverableException을 catch하고 연결을 다시 시도하는 시도가 작동하지 않았습니다. – user3357381

+0

일부 옵션 : 1. 웹 컨테이너를 사용하여 연결 (및 연결 풀)을 관리합니다. 2. 연결을 재사용하지 마십시오. 필요할 때만 열고 완료되면 닫습니다. 3. 권장 사항은 아니지만 옵션 : 타이머를 사용하여 데이터베이스를 정기적으로 ping하여 시간 초과를 방지하십시오. – copeg

+0

자체 연결 풀을 작성하지 마십시오. 기존 것을 사용하십시오. 생각하는 것처럼 단순하지 않습니다. – EJP

답변

0

난 당신이 UCP (범용 연결 풀), here을 발견하고 Validate When Borrowing 기능을 사용할 수 있습니다 오라클 연결 풀을 사용하는 것이 좋습니다. 이 방법을 사용하면 UCP가 필요할 때 연결의 유효성을 테스트하고 필요할 경우 다시 연결합니다.

관련 문제