Oracle JDBC Pool Connection访问分配策略?

标签 oracle jdbc connection-pooling

使用 Oracle JDBC 连接池时,有没有办法控制连接的分发方式?特别是,有没有办法指定使用 LIFO 策略?似乎可以以循环方式分发连接。

在这种情况下:

  • 已使用池中的最大连接数 (10)
  • 此后,只使用一个并发连接,每 5 秒检索并返回一次
  • 不活动超时设置为 60 秒

如果使用循环策略,则 10 个池连接中的每一个都将在 60 秒的时间段内使用。当不活动超时检查发生时,每个连接都将在最后一分钟内处于事件状态,因此没有连接将被关闭。连接池将保留 10 个连接,但实际上只需要 1 个。至少那是我似乎正在经历的。我希望池缩小到只有 1 个连接。

我对驱动程序工作原理的理解是否正确?有没有办法控制池中的连接分配策略(后进先出、先进先出、循环法),还是我必须使用其他池机制?

下面是一个测试(使用已弃用的 api)。在这种情况下,创建了 3 个连接,它只会收缩回 2 个,而不是 1 个。

编辑以更准确地反射(reflect)上述描述:

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) {}; }
            }
        }
    }

}

最佳答案

Oracle 支持人员回应说,使用循环法从池中反馈连接。在 Oracle JDBC 12(当前版本为 11.2.0.3)中,将有一个属性“UseLIFO”,它将允许“后进先出”检索:

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

在问题中发布的示例中,这将使空闲超时将池缩小为单个连接。

关于Oracle JDBC Pool Connection访问分配策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8955974/

相关文章:

Oracle 翻译的 Java 等效项

java - 以编程方式将数据从 S3 或 Azure 加载到 MemSQL 的最佳方式是什么?

java - 如何使用 commons dbutils 获取生成的 key ?

web-services - 如何使用 apache commons pool 通过超时将对象返回到池中

java - Tomcat 连接池创建太多连接,卡在 sleep 模式

oracle - 我如何在 PL/SQL 中创建一个可以创建限制的触发器,以便它们只能放置 1 个字符?

python - 有时,Django 消息在请求之间重复(即,它们没有被清除)

sql-server - 在 ASP.Net 应用程序中从连接池获取新连接超时。我需要缓解建议

Java ORA-01034 : ORACLE not available

java - Spring Boot + MySQL 社区服务器