2015-11-05 9 views
2

Как настроить c3p0 в контексте весеннего приложения?Настройка c3p0 в контексте весеннего приложения (intSQL и часовой пояс)

Я бегу mybatis + весна + c3p0 + Oracle 11g.

c3p0 документация extensions говорит:

расширения по умолчанию: пустая java.util.Map java.util.Map (сырье типа) , содержащее значение всех пользовательских расширений конфигурации , определенных для этот DataSource.

c3p0 документация user extensions to configurations говорит:

<extensions> 
    <property name="initSql">SET SCHEMA 'foo'</property> 
    <property name="timezone">PDT</property> 
</extensions> 

Поэтому я настроил мой контекст приложения пружинный как:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="jdbcUrl" value="jdbc:oracle:thin:@//databasehost:1527/servicename" /> 
    <property name="user" ref="database.user" /> 
    <property name="password" ref="database.password" /> 
    <property name="extensions"> 
     <map> 
      <entry key="initSql" value="ALTER SESSION SET CURRENT_SCHEMA = MY_SCHEMA" /> 
      <entry key="timezone" value="UTC" /> 
     </map> 
    </property> 
</bean> 

Однако ничего не происходит, он не бросает ошибку но не ведет себя так, как ожидалось.

ответ

2

То, что вы сделали в своем ответе не достаточно, чтобы заставить его работать.

Если вы исследуете свой журнал mysql, вы увидите, что параметр timezone никогда не вступает в силу, например, (никогда не будет выполняться инструкция «set time_zone ...»).

Единственное, что вступает в силу в вашем ответе: preferredTestQuery, которое вы установили равным alter session set current_schema=MY_SCHEMA.

Это означает, что каждый Checkin (который происходит до почти каждый запрос вы исполняете - то есть слишком много) также называют alter session set current_schema=MY_SCHEMA, который является очень плохая практика, производительность ...

Если вы хотите выполните некоторые SQL при подключении, вам необходимо использовать ConnectionCustomizer в сочетании с созданной вами картиной extensions. (Вы можете увидеть, что написано в их документации here)

Пример:

public class ExampleConnectionCustomizer extends AbstractConnectionCustomizer { 
    public ExampleConnectionCustomizer() { 
    } 

    private String getInitSql(String parentDataSourceIdentityToken) { 
     return (String)this.extensionsForToken(parentDataSourceIdentityToken).get("initSql"); 
    } 

    public void onAcquire(Connection c, String pdsIdt) { 
     String initSql = this.getInitSql(parentDataSourceIdentityToken); 
     if(initSql != null) { 
      Statement stmt = null; 
      try { 
       stmt = c.createStatement(); 
       stmt.executeUpdate(initSql); 
      } finally { 
       if(stmt != null) { 
        stmt.close(); 
       } 
      } 
     } 
    } 

} 


<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    ....The rest of your properties... 
    <property name="preferredTestQuery" value="SELECT 1" /> <!--Much more efficient--> 
    <property name="connectionCustomizerClassName" value="yourpackage.ExampleConnectionCustomizer" /> 
    <!-- extensions -->   
    <property name="extensions"> 
     <map> 
      <entry key="initSql" value="alter session set current_schema=MY_SCHEMA" /> 
     </map> 
    </property> 
</bean> 
+0

Это отлично. Большое спасибо за Вашу помощь. Для справки, здесь приведены javadocs для InitSqlConnectionCustomizer, содержащие аналогичную функцию: https://github.com/swaldman/c3p0/blob/9f97c814aef31b2997d6ecfad1e3875c6136317b/src/java/com/mchange/v2/c3p0/example/InitSqlConnectionCustomizer.java – Rafa

+0

Спасибо и удачи в будущих проблемах. –

-1

EDIT: Неплохая идея. Лучше следовать подходу Shay Elkayam в


После большого рытья я пришел с этим полностью рабочей конфигурации:

<!-- 
    DataSource with connection polling 
    For more details, see: http://www.mchange.com/projects/c3p0/ 
--> 
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> 
    <property name="jdbcUrl" value="jdbc:oracle:thin:@//hostaname:1527/servicename" /> 
    <property name="user" value="user" /> 
    <property name="password" value="password" /> 
    <!-- Other DataSource Configuration --> 
    <property name="numHelperThreads" value="10" /> 
    <property name="maxAdministrativeTaskTime" value="10000" /> 
    <!-- pool sizing --> 
    <property name="initialPoolSize" value="3" /> 
    <property name="minPoolSize" value="10" /> 
    <property name="maxPoolSize" value="35" /> 
    <property name="acquireIncrement" value="3" /> 
    <property name="maxStatements" value="0" /> 
    <!-- retries --> 
    <property name="acquireRetryAttempts" value="30" /> 
    <property name="acquireRetryDelay" value="1000" /> <!-- 1s --> 
    <property name="breakAfterAcquireFailure" value="false" /> 
    <!-- refreshing connections --> 
    <property name="maxIdleTime" value="180" /> <!-- 3min --> 
    <property name="maxConnectionAge" value="300" /> 
    <!-- timeouts and testing --> 
    <property name="checkoutTimeout" value="5000" /> <!-- 5s --> 
    <property name="idleConnectionTestPeriod" value="60" /> <!-- 60s --> 
    <property name="testConnectionOnCheckout" value="true" /> 
    <property name="testConnectionOnCheckin" value="true" /> 
    <property name="preferredTestQuery" value="alter session set current_schema=MY_SCHEMA" /> 
    <!-- extensions -->   
    <property name="extensions"> 
     <map> 
      <entry key="timezone" value="UTC" /> 
     </map> 
    </property> 
</bean> 

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

  • Нет связанных вопросов^_^