代码之家  ›  专栏  ›  技术社区  ›  Gandalf

OracleDataSource与Oracle UCP PoolDataSource

  •  37
  • Gandalf  · 技术社区  · 16 年前

    Oracle发现了一些新的连接池(Universal-Connection-Pool,JDP-Pool),而Oracle发现了一些新的连接池(Universal-Connection-Pool,UCP-Pool)。现在,它使用一个新类PoolDataSource来进行连接池,而不是OracleDataSource[启用缓存选项]。我正在考虑是否切换到这个新的实现,但找不到任何好的文档说明这会给我带来什么(如果有的话)修复/升级。有人对两者都有经验吗?优点/缺点?谢谢

    8 回复  |  直到 16 年前
        1
  •  35
  •   rjdkolb Stefan Isele - prefabware.com    7 年前

    最新的Oracle jdbc驱动程序(11.2.0.1.0)显式声明已弃用Oracle隐式连接缓存(即使用OracleDataSource的连接缓存):

    此版本有什么新功能?

    在此版本中,Oracle隐式连接缓存功能是 而不是连接池。UCP具有 国际商会,还有更多。UCP在单独的jar文件中可用,

    因此,我认为最好开始使用UCP,但文档并没有那么好。 例如,我没有找到将UCP与spring一起使用的方法。。。

    我找到了正确的spring配置: 好的,我想我找到了正确的配置:

    <bean id="dataSource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
        <property name="URL" value="jdbc:oracle:thin:@myserver:1521:mysid" />
        <property name="user" value="myuser" />
        <property name="password" value="mypassword" />
        <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource" />
        <property name="connectionPoolName" value="ANAG_POOL" />
        <property name="minPoolSize" value="5" />
        <property name="maxPoolSize" value="10" />
        <property name="initialPoolSize" value="5" />
        <property name="inactiveConnectionTimeout" value="120" />
        <property name="validateConnectionOnBorrow" value="true" />
        <property name="maxStatements" value="10" />
    </bean>
    

        2
  •  9
  •   YoYo    10 年前

    PDS是“通用”的,因为它为非Oracle数据库(如MySQL)提供与ODS中相同级别的池功能。

    看见 UCP Dev Guide an article on Oracle website UCP Transition Guide

    我看不出从ODS迁移到UCP(PDS)有什么直接的好处,但也许将来Oracle会反对ODS中的一些功能。我用过ODS一段时间,现在我很满意,但是如果我开始用新的,我会用PDS。

        3
  •  4
  •   Community Mohan Dere    8 年前
        4
  •  3
  •   Wm. Bainbridge    14 年前

    在同一代码中运行的OracleDataSource似乎不会泄漏游标,因此不会导致此问题。

        5
  •  3
  •   JavaDev03    14 年前

    我也在测试UCP,发现自己在基于线程池的应用程序中存在性能问题。最初,我尝试了OracleDataSource,但在为批处理配置它时遇到了问题。我不断在连接中发现NullPointerException,这让我相信我存在某种类型的连接泄漏,但只有在某些应用程序中,我们管理的其他应用程序不是面向批处理的,OracleDataSource才能很好地工作。

        6
  •  2
  •   Brett Okken    10 年前

    如果使用连接验证,隐式连接缓存的性能要比UCP好得多。这对应于bug 16723836,计划在12.1.0.2中修复。

    并发负载增加时的连接。测试比较了oracle 隐式连接缓存、tomcat池和UCP。三个都是 配置为允许最多200个连接,最少20个连接和 它们将从池中移除。tomcat池使用语句“select sysdate from dual”用于验证。

    在5个并发线程中,UCP是最慢的,但是是全面的连接管理 随着并发性的增加,UCP越来越落后于

    25 Threads:
    Implicit: 0.58ms
    Tomcat: 0.92ms
    UCP: 1.50ms
    
    50 Threads:
    Implicit: 0.92ms
    Tomcat: 1.60ms
    UCP: 6.80ms
    
    100 Threads:
    Implicit: 2.60ms
    Tomcat: 3.20ms
    UCP: 21.40ms
    
    180 Threads:
    Implicit: 13.86ms
    Tomcat: 15.34ms
    UCP: 40.70ms
    
        7
  •  0
  •   Az.MaYo    11 年前

    在springbean.xml中使用UCP有两种可能的方法。

    对于由某个文件设置的db.properties,请加载该文件,然后使用其中一个:

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    
        <property name="location">
            <value>classpath:resources/db.properties</value>
        </property>
    </bean>
    

    <bean id="dataSource" class="oracle.ucp.jdbc.PoolDataSourceImpl">
    
        <property name="URL" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    
        <property name="validateConnectionOnBorrow" value="true"/>
    
        <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource" />
        <property name="connectionPoolName" value="TEST_POOL" />
        <property name="minPoolSize" value="10" />
        <property name="maxPoolSize" value="20" />
        <property name="initialPoolSize" value="12" />
    </bean>
    

    第二个是oracle.ucp.jdbc.PoolDataSourceFactory:-

     <bean id="dataSource" class="oracle.ucp.jdbc.PoolDataSourceFactory"  
         factory-method="getPoolDataSource">        
        <property name="URL" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    
        <property name="validateConnectionOnBorrow" value="true"/>
    
        <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource" />
        <property name="connectionPoolName" value="TEST_POOL" />
        <property name="minPoolSize" value="10" />
        <property name="maxPoolSize" value="20" />
        <property name="initialPoolSize" value="12" />
    </bean>
    

    就这样:) 以下是详细文档的链接: https://docs.oracle.com/cd/E11882_01/java.112/e12265/connect.htm#CHDDCICA

        8
  •  0
  •   RealHowTo    7 年前

    我试过ucp,性能更好。。。可能是使用这个的关键

    oracle.ucp.jdbc.PoolDataSource ds = (oracle.ucp.jdbc.PoolDataSource)envContext.lookup(url_r);
    MyConnectionLabelingCallback callback = new MyConnectionLabelingCallback();
    ds.registerConnectionLabelingCallback( callback );
    
    
    Properties label = new Properties();
    label.setProperty(pname, KEY);
    conn = ds.getConnection(label);
    

    这有助于借用连接并永远不要关闭它。。所以表演很棒

    public class MyConnectionLabelingCallback
    implements ConnectionLabelingCallback {
    
          public MyConnectionLabelingCallback()
          {
          }
    
          public int cost(Properties reqLabels, Properties currentLabels)
          {
    
            // Case 1: exact match
            if (reqLabels.equals(currentLabels))
            {
              System.out.println("## Exact match found!! ##");
              return 0;
            }
    
            // Case 2: some labels match with no unmatched labels
            String iso1 = (String) reqLabels.get("TRANSACTION_ISOLATION");
            String iso2 = (String) currentLabels.get("TRANSACTION_ISOLATION");
            boolean match =
              (iso1 != null && iso2 != null && iso1.equalsIgnoreCase(iso2));
            Set rKeys = reqLabels.keySet();
            Set cKeys = currentLabels.keySet();
            if (match && rKeys.containsAll(cKeys))
            {
              System.out.println("## Partial match found!! ##");
              return 10;
            }
    
            // No label matches to application's preference.
            // Do not choose this connection.
            System.out.println("## No match found!! ##");
            return Integer.MAX_VALUE;
          }
    
          public boolean configure(Properties reqLabels, Object conn)
          {
    
              System.out.println("Configure################");
            try
            {
              String isoStr = (String) reqLabels.get("TRANSACTION_ISOLATION");
              ((Connection)conn).setTransactionIsolation(Integer.valueOf(isoStr));
              LabelableConnection lconn = (LabelableConnection) conn;
    
              // Find the unmatched labels on this connection
              Properties unmatchedLabels =
               lconn.getUnmatchedConnectionLabels(reqLabels);
    
              // Apply each label <key,value> in unmatchedLabels to conn
              for (Map.Entry<Object, Object> label : unmatchedLabels.entrySet())
              {
                String key = (String) label.getKey();
                String value = (String) label.getValue();
                lconn.applyConnectionLabel(key, value);
              }
            }
            catch (Exception exc)
            {
    
              return false;
            }
            return true;
          }
        }
    
    推荐文章