Java 需要oracle JDBC驱动程序的数据源并启用/禁用缓存连接

Java 需要oracle JDBC驱动程序的数据源并启用/禁用缓存连接,java,oracle,spring,jdbc,Java,Oracle,Spring,Jdbc,有Oracle 11g2和基于Java的spring应用程序 对于oracle JDBC驱动程序,需要在运行时启用/禁用CacheConnection功能的数据源-即,如果CacheConnection启用,则未建立新连接如果数据源中存在空闲连接,如果CacheConnection禁用,则始终建立新连接,并且在进入空闲状态后关闭存在 早期我们使用apache数据源: <bean id="datasourceClassic" class="org.apache.commons.dbcp.

有Oracle 11g2和基于Java的spring应用程序

对于oracle JDBC驱动程序,需要在运行时启用/禁用CacheConnection功能的数据源-即,如果CacheConnection启用,则未建立新连接如果数据源中存在空闲连接,如果CacheConnection禁用,则始终建立新连接,并且在进入空闲状态后关闭存在

早期我们使用apache数据源:

<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>
--具有此功能,但仅当在context.xml中明确设置此选项,并且方法
setconnectionachingabled
从运行时被弃用时,此功能才起作用

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>
以及:


类似于
-您对此有何看法?

您是否能够创建一个启用缓存和禁用缓存的数据源?如果是这样,您可以在ApplicationContext中创建两个具有不同名称和配置的不同数据源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
  ...
}

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

[UPDATE]我用
org.apache.commons.dbcp.BasicDataSource测试下一个trik
:BasicDataSource.setMaxIdle(0)-表示禁用,BasicDataSource.setMaxIdle(bds.getMaxActive())表示启用。您对此有何看法?此解决方案非常有用,因为启用缓存的数据源只会在一段时间内释放活动会话,这可能是DB业务逻辑中的一个问题-所有活动连接都必须关闭
/* "Disable" CacheConnection  */
BasicDataSource bds = ... //get DataSource
bds.setMaxIdle(0);
/* "Enable" CacheConnection */
BasicDataSource bds = ... //get DataSource
bds.setMaxIdle(bds.getMaxActive());
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
  ...
}