如何使用Spring,Hibernate 3.3和c3p0配置MySQL连接属性?
问题描述:
我目前正在将应用程序从Hibernate 3.2升级到Hibernate 3.3。我虽然坚持使用默认连接池(休眠因子从Commons DBCP改为c3p0),因为我没有任何理由选择非默认池。至少不是,但之前使用过DBCP。如何使用Spring,Hibernate 3.3和c3p0配置MySQL连接属性?
到目前为止升级几乎没有任何问题。我唯一不能工作的是将属性传递给底层的MySQL JDBC4Connection。到目前为止,我使用DBCP的BasicDataSource.addConnectionProperty(String,String)来传递属性(useUnicode = true,characterEncodin = UTF-8,characterSetResults = UTF-8,zeroDateTimeBehavior = convertToNull)。
但是,我找不到任何方法对除including them in the JDBC URL之外的c3p0执行相同操作。 (这是我想避免的,因为我想保持URL的可配置性而不强制用户包含这些参数。)
到目前为止,我试图使用ConnectionCustomizer而没有成功。还有其他建议吗?
答
再次一个问题,我回答我(另一个自我学习是吗?!):
com.mchange.v2.c3p0.ComboPooledDataSource有一个属性 “properties”。有趣的是,在用户和密码之后设置属性会覆盖它们。但在用户和密码之前设置属性按预期工作。
答
追问自我答案。 的配置此的弹簧方式的例子:
数据源豆:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="properties" ref="mysqlConnectionProperties"></property>
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- c3p0 combo pooled data source settings -->
<property name="initialPoolSize" value="3" />
<property name="minPoolSize" value="3" />
<property name="maxPoolSize" value="50" />
<property name="maxIdleTime" value="7200" />
<property name="maxStatements" value="200" />
<property name="idleConnectionTestPeriod" value="270" />
<property name="preferredTestQuery">
<value>SELECT 1</value>
</property>
</bean>
性质豆:
<bean id="mysqlConnectionProperties" class="java.util.Properties">
<constructor-arg>
<props>
<prop key="useTimezone">true</prop>
<prop key="serverTimezone">America/Chicago</prop>
<!-- add any other properties you have -->
</props>
</constructor-arg>
</bean>