2015-11-05 70 views
2

如何在spring应用程序上下文中配置c3p0?在Spring应用程序上下文中配置c3p0(intSQL和timezone)

我正在运行mybatis + spring + c3p0 + Oracle 11g。

extensions C3P0文档说:

扩展默认值:包含用于定义的任何用户定义的配置的扩展 的值的空java.util.Map甲java.util.Map(原始类型) 这个数据源。

user extensions to configurations c3p0文档,说:

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

因此,我配置了我的Spring应用程序上下文为:

<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

这意味着每签(几乎每个查询您执行这发生之前 - 即太多)也会打电话给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

这是伟大的。非常感谢您的帮助。仅供参考,以下是包含类似功能的InitSqlConnectionCustomizer的javadoc:https://github.com/swaldman/c3p0/blob/9f97c814aef31b2997d6ecfad1e3875c6136317b/src/java/com/mchange/v2/c3p0/example/InitSqlConnectionCustomizer。java – Rafa

+0

谢谢,祝你在未来的问题中运气好。 –

-1

编辑:不是一个好主意。更好地遵循吉文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> 
相关问题