Java 需要oracle JDBC驱动程序的数据源并启用/禁用缓存连接
有Oracle 11g2和基于Java的spring应用程序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 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
...
}