2016-09-22 5 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を捕捉して接続を再確立しようとしましたが動作しませんでした。 – user3357381

+0

いくつかのオプション:1. Webコンテナを使用して接続(および接続プール)を管理します。2.接続を再利用しようとしないでください。必要なときのみ開き、完了したら閉じます。オプション:タイマーを使用してデータベースを定期的にpingしてタイムアウトを回避する – copeg

+0

独自の接続プールを作成しないでください。既存のものを使用してください。あなたが考えるように単純ではありません。 – EJP

答えて

0

私はあなたがUCP(ユニバーサル接続プール)、hereを発見してからValidate When Borrowing機能を使用することができますOracleの接続プールを使用することをお勧め。このようにして、必要なときに接続の有効性をUCPでテストし、必要に応じて再接続します。

関連する問題