有基于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" />
一样工作 - 您对此有何看法?
答案 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并在它们之间切换。请注意,后一种解决方案可以防止结果缓存;我不确定第一种解决方案对缓存的影响。