4

我目前正在将应用程序从 Hibernate 3.2 升级到 Hibernate 3.3。虽然我会坚持使用默认连接池(Hibernate 将其默认值从Commons DBCP更改为c3p0),因为我没有任何充分的理由选择非默认池。至少没有,但以前使用过 DBCP。

到目前为止,升级几乎没有任何问题。我唯一不能工作的是将属性传递给底层的 MySQL JDBC4Connection。到目前为止,我使用 DBCP 的BasicDataSource.addConnectionProperty(String,String)来传递属性(useUnicode=true,characterEncodin=UTF-8,characterSetResults=UTF-8,zeroDateTimeBehavior=convertToNull)。

但是,除了将它们包含在 JDBC URL 中之外,我找不到任何对 c3p0 执行相同操作的方法。(这是我想避免的事情,因为我想保持 URL 可配置而不强迫用户包含这些参数。)

到目前为止,我尝试使用ConnectionCustomizer没有成功。还有其他建议吗?

4

2 回答 2

4

我再一次回答自己的问题(另一个自学者?是的,拜托!):

com.mchange.v2.c3p0.ComboPooledDataSource有一个属性“属性”。有趣的是,在用户和密码之后设置属性会覆盖它们。但是在用户和密码之前设置属性可以按预期工作。

于 2010-03-26T15:39:29.840 回答
1

Follow up for the self answer. An example of a spring way of configuring this:

The Data source bean:

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

The properties 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>
于 2012-03-29T11:12:53.043 回答