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