需要DataSource for oracle JDBC驱动程序,启用/禁用CacheConnection

时间:2011-02-10 14:10:14

标签: java oracle spring jdbc

有基于Spring 11的Oracle 11g2和应用程序Java 需要DataSource for oracle JDBC驱动程序,启用/禁用CacheConnection功能在运行时 - 即如果CacheConnection启用新连接未建立,如果DataSource中有空闲连接,如果CacheConnection被禁用,则始终建立新连接并且在置入空闲后存在关闭

早期我们使用apache DataSource:

<bean id="datasourceClassic" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
                <property name="driverClassName" value="oracle.jdbc.OracleDriver" /> 
                <property name="url" value="jdbc:oracle:oci:@TEST" />
                <property name="username" value="TEST" />
                <property name="password" value="TEST" />
                <property name="maxActive" value="10" />
                <property name="defaultAutoCommit" value="false" /> 
</bean>

- 但此数据源没有启用/禁用CacheConnection的功能
我们测试了OracleDataSource
    

        <property name="URL" value="jdbc:oracle:oci:@TEST" />
        <property name="user" value="TEST" />
        <property name="password" value="TEST" />
        <property name="connectionCachingEnabled" value="true" />
        <property name="connectionCacheProperties">
            <props> 
                <prop key="MinLimit">0</prop> 
                <prop key="MaxLimit">1</prop> 
                <prop key="InitialLimit">0</prop> 
                <prop key="InactivityTimeout">10</prop> 
                <prop key="ConnectionWaitTimeout">10</prop>
                <prop key="ValidateConnection">true</prop>
            </props> 
        </property>
    </bean>

- 具有此功能但仅当explicity在context.xml中设置此选项并且方法setConnectionCachingEnabled从运行时间中删除时才有效
Oracle自11g2推荐使用通用连接池(UCP)

<bean id="datasource2" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
        <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/>
        <property name="connectionPoolName" value="TEST"/>

        <property name="URL" value="jdbc:oracle:oci:@TEST" />
        <property name="user" value="TEST" />
        <property name="password" value="TEST" />
        <property name="initialPoolSize" value="0" />
        <property name="minPoolSize" value="0" />
        <property name="maxPoolSize" value="1" />
        <property name="validateConnectionOnBorrow" value="true" />
    </bean>

- 但是这个池也没有启用/禁用CacheConnection的功能......


知道DataSource能满足我的要求吗?


更新:
我用org.apache.commons.dbcp.BasicDataSource测试下一个trik:

/* "Disable" CacheConnection  */
BasicDataSource bds = ... //get DataSource
bds.setMaxIdle(0);

/* "Enable" CacheConnection */
BasicDataSource bds = ... //get DataSource
bds.setMaxIdle(bds.getMaxActive());

<property name="connectionCachingEnabled" value="true" />一样工作 - 您对此有何看法?

1 个答案:

答案 0 :(得分:0)

您是否能够创建启用了缓存的数据源和禁用缓存的数据源?如果是这样,您可以在ApplicationContext中创建两个具有不同名称和配置的不同DataSource bean。您可以在应用程序中自动装配它们并动态切换它们。

public class MyClass {
  @Autowired
  @Qualifier("datasourceCacheDisabled")
  DataSource cacheDisabledDataSource;
  @Autowired
  @Qualifier("datasourceCacheEnabled")
  DataSource cacheEnabledDataSource;
  DataSource dataSource=null;

  boolean enableCache;
  public MyClass() {
    // enable by default
    enableDataSourceCaching();
  }
  public void enableDataSourceCaching() {
    enableCache=true;
    dataSource=cacheEnabledDataSource;
  }
  public void disableDataSourceCaching() {
    enableCache=false;
    dataSource=cacheDisabledDataSource;
  }
  // code which uses the current dataSource
  ...
}

或者,如果您需要已连接DataSource的bean,则可以创建两个ApplicationContexts并在它们之间切换。请注意,后一种解决方案可以防止结果缓存;我不确定第一种解决方案对缓存的影响。