2011-02-10 3 views
2

Есть Oracle 11g2 и приложений Java на основе весны

нуждающегося DataSource для драйвера Oracle JDBC с включения/выключения CacheConnection функциональной во время исполнения - то есть, если CacheConnection это включить новый соединение не установлено, если есть свободное соединение в DataSource, если CacheConnection отключается всегда новое соединение установлено и существование закрытия после того, как положить в режиме ожидания

в начале мы использовали апачский DataSource:Необходимость DataSource для драйвера Oracle JDBC с включить/отключить CacheConnection

<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> 

- иметь этот функционал, но это работает только, если в явной форме установить эти параметры в context.xml и методе setConnectionCachingEnabled depreceted от выполнения

Oracle, поскольку 11g2 порекомендовано использование Универсальных пул соединений (ОГП):

<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 может удовлетворить мои требования?


UPDATE:
Испытываю следующий трик с org.apache.commons.dbcp.BasicDataSource:

/* "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

[UPDATE] Я тестирую следующий трик с 'org.apache.commons.dbcp.BasicDataSource': BasicDataSource.setMaxIdle (0) - для disable и BasicDataSource.setMaxIdle (bds.getMaxActive()) - для включения. Что Вы думаете об этом? – Testus

ответ

0

Можете ли вы создать источник данных с включенным кешированием и отключенным кэшированием? Если это так, вы можете создать два разных компонента DataSource с разными именами и конфигурациями в вашем ApplicationContext. Вы можете использовать как в своем приложении, так и динамически переключаться между ними.

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 проводной уже, вы можете создать два ApplicationContexts и переключаться между ними. Обратите внимание, что последнее решение предотвращает кеширование результатов; Я не уверен в эффекте кэширования с первым решением.

+0

Это решение полезно из-за того, что DataSource с включенным кешем будет освобождать активный сеанс только с некоторого времени, и это может быть проблемой в бизнес-логике БД - все активное соединение должно быть закрыто – Testus

Смежные вопросы