Необходим источник данных для драйвера JDBC оракула с включением / отключением CacheConnection - PullRequest
2 голосов
/ 10 февраля 2011

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

Потребность в DataSource для драйвера JDBC oracle с функцией включения / выключения 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 может удовлетворить мои требования?


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" /> - что вы думаете об этом?

1 Ответ

0 голосов
/ 21 апреля 2011

Можете ли вы создать источник данных с включенным кэшированием и с отключенным кэшированием?Если это так, вы можете создать два разных компонента 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
  ...
}

В качестве альтернативы, если вам нужны компоненты с уже подключенным источником данных, вы можете создать два ApplicationContexts и переключаться между ними.Обратите внимание, что последнее решение предотвращает кэширование результатов;Я не уверен насчет влияния на кеширование с первым решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...