2012-01-21 41 views
3

Oracle JDBC接続プールを使用する場合、接続の引き渡し方法を制御する方法はありますか?特に、LIFO戦略を使用して指定する方法はありますか?接続がラウンドロビン方式で引き渡されるようです。Oracle JDBCプール接続のアクセス割り当て戦略?

このシナリオでは:プール内の

  • 最大接続が使用されている(10)
  • その後、唯一の同時接続がこれまで使用されている、すべての5秒が取得され、
  • 無活動タイムアウトに設定されて戻りました60秒

ラウンドロビン方式を使用する場合、プールされた10個の接続はそれぞれ60秒以内に使用されます。インアクティビティタイムアウトチェックが発生すると、すべての接続が直近1分間にアクティブになっているため、接続を確立する候補はありません。接続プールには10の接続が残っていますが、実際には1つしか必要ありません。少なくともそれは私が経験しているようです。プールを1つの接続に縮小したいと思います。

ドライバの正しい動作を理解していますか?接続割り当て戦略をプール(LIFO、FIFO、ラウンドロビン)から制御する方法はありますか、他のプーリングメカニズムを使用する必要がありますか?

以下はテストです(廃止されたapisを使用しています)。この場合、3つの接続が作成され、それが唯一のより密接な説明の上に反映させるために、2まで戻っていない1.

EDITを縮小します:

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import oracle.jdbc.pool.OracleDataSource; 


public class Main { 

    public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException, SQLException { 

     String url = "jdbc:oracle:thin:@//host:1521/SID"; 
     String user = "user"; 
     String pwd = "pwd"; 

     OracleDataSource ocpds; 

     ArrayList<Connection> tempConnList = new ArrayList<>(); 


     try { 

      ocpds = new OracleDataSource(); 
      ocpds.setURL(url); 
      ocpds.setUser(user); 
      ocpds.setPassword(pwd); 

      java.util.Properties prop = new java.util.Properties(); 
      prop.setProperty("MinLimit", "1"); 
      prop.setProperty("MaxLimit", "10"); 

      prop.setProperty("InactivityTimeout", "60"); // seconds 
      prop.setProperty("AbandonedConnectionTimeout", "60"); // seconds 
      prop.setProperty("PropertyCheckInterval", "60"); // seconds    

      // set DataSource properties 
      ocpds.setConnectionCachingEnabled(true); 
      ocpds.setConnectionCacheProperties(prop); 
      ocpds.setConnectionCacheName("TestCache"); 


      // Ramp up to max 
      for (int i=0; i<10; i++) { 
       Connection conn = ocpds.getConnection(); 
       tempConnList.add(conn); 
      } 

      // Release them all 
      for (Connection conn : tempConnList) { 
       conn.close(); 
      } 


      // Grab and release one connection at a time 
      for (int i = 0; i < 60; i++) { 

       System.out.println(new java.util.Date()); 

       // Grab and release 
       Connection conn = ocpds.getConnection(); 
       conn.close(); 

       try { 
        Thread.currentThread().sleep(5000); 
       } catch (InterruptedException ie) { 
        System.err.println("error message: " + ie.getMessage()); 
       } 

      } 

     } catch (SQLException e) { 
      System.err.println("error message: " + e.getMessage()); 
     } finally { 
      for (Connection conn : tempConnList) { 
       if (conn != null) { try { conn.close(); } catch (SQLException ignored) {}; } 
      } 
     } 
    } 

} 

答えて

2

Oracleサポートは、ラウンドロビン方式と回答していますプールからの接続をフィードバックするために使用されます。 OracleのJDBC 12(現在のバージョンは11.2.0.3である)で、「最後の最初のアウトで」検索をできるようになりますされ、「UseLIFO」プロパティが存在します。

prop.setProperty("UseLIFO", "true"); 

質問に投稿された例では、これは、プールを単一の接続に縮小するためにアイドルタイムアウトさせます。

+0

11g以上では、OracleはUseLIFOプロパティを提供するOracleImplicitConnectionCacheを非推奨にしました。 Oracleは代わりに[UniversalConnectionPool](http://docs.oracle.com/cd/E18283_01/java.112/e12265/connect.htm)を使用するように言います.UCPにはデータソースが必要です。このプロパティはサポートされていません。したがって、UCPを使用して11gまたは12cのドライバに移行すると、この動作を使用することは可能ですか? –