Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle JDBC池连接访问分配策略?_Oracle_Jdbc_Connection Pooling - Fatal编程技术网

Oracle JDBC池连接访问分配策略?

Oracle JDBC池连接访问分配策略?,oracle,jdbc,connection-pooling,Oracle,Jdbc,Connection Pooling,在使用Oracle JDBC连接池时,是否有方法控制连接的分发方式?特别是,是否有办法指定使用后进先出策略?似乎这些联系可能会以循环的方式分发 在这种情况下: 池中使用的最大连接数(10) 此后,仅使用一个并发连接,每5秒检索并返回一次 不活动超时设置为60秒 如果使用循环策略,10个池连接中的每一个都将在60秒内使用。当进行非活动超时检查时,每个连接都将在最后一分钟内处于活动状态,因此没有连接是要关闭的候选连接。连接池将保留10个连接,尽管实际上只需要1个。至少这是我似乎正在经历的。我希望

在使用Oracle JDBC连接池时,是否有方法控制连接的分发方式?特别是,是否有办法指定使用后进先出策略?似乎这些联系可能会以循环的方式分发

在这种情况下:

  • 池中使用的最大连接数(10)
  • 此后,仅使用一个并发连接,每5秒检索并返回一次
  • 不活动超时设置为60秒
如果使用循环策略,10个池连接中的每一个都将在60秒内使用。当进行非活动超时检查时,每个连接都将在最后一分钟内处于活动状态,因此没有连接是要关闭的候选连接。连接池将保留10个连接,尽管实际上只需要1个。至少这是我似乎正在经历的。我希望池缩小到只有一个连接

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

下面是一个测试(使用不推荐使用的API)。在本例中,创建了3个连接,它只会缩小到2个,而不是1个

编辑以更紧密地反映上述说明:

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

}
import java.io.IOException;
导入java.sql.Connection;
导入java.sql.SQLException;
导入java.util.ArrayList;
导入oracle.jdbc.pool.OracleDataSource;
公共班机{
公共静态void main(字符串[]args)抛出InterruptedException、IOException、ClassNotFoundException、SQLException{
String url=“jdbc:oracle:thin:@//host:1521/SID”;
字符串user=“user”;
字符串pwd=“pwd”;
OracleDataSource ocpds;
ArrayList tempConnList=新建ArrayList();
试一试{
ocpds=新的OracleDataSource();
setURL(url);
ocpds.setUser(用户);
ocpds.设置密码(pwd);
java.util.Properties=new java.util.Properties();
产权设定属性(“最低限额”、“1”);
属性设置(“最大限制”、“10”);
prop.setProperty(“InactivityTimeout”,“60”);//秒
prop.setProperty(“放弃连接超时”,“60”);//秒
prop.setProperty(“PropertyCheckInterval”,“60”);//秒
//设置数据源属性
ocpds.setConnectionCachingEnabled(真);
ocpds.setConnectionCacheProperties(prop);
setConnectionCacheName(“TestCache”);
//升到最高点

对于(int i=0;iOracle支持部门回应说,使用循环方法从池中反馈连接。在Oracle JDBC 12(当前版本为11.2.0.3)中,将有一个属性“UseLIFO”,它将允许“后进先出”检索:

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

在问题中发布的示例中,这将允许空闲时间将池缩减为单个连接。

从11g开始,Oracle已弃用提供UseLIFO属性的OracleImplicitConnectionCache。Oracle表示改为使用。UCP需要一个数据源;而此属性不受支持。因此,移动到11g或12c驱动程序使用UCP,是否仍然可以使用此行为?