6

我正在使用 Spring 3.1.0.RELEASE、Hibernate 4.0.1.Final 和 MySQL 5.1。我应该使用什么汇集数据源?我目前正在使用(来自应用程序上下文文件的片段)......

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
        <value>jdbc:mysql://localhost:3306/myproj</value>
    </property>
    <property name="username">
        <value>myproj</value>
    </property>
    <property name="password">
        <value>password</value>
    </property>
</bean>

但这不是池数据源,在每次调用时都创建 JDBC 连接。我曾经有这个 Hibernate 配置 (hibernate.cfg.xml) ...

<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myproj</property>
    <property name="hibernate.connection.username">myproj</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.connection.pool_size">10</property>
    <property name="show_sql">true</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    ...

但是由于 Spring 3.1.0 中的一个错误,我在配置会话工厂 bean 时无法使用 hibernate.cfg.xml 文件(我试图这样做——来自 spring 应用程序上下文文件的片段......)

<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" id="sessionFactory">
    <property name="configLocation"> 
        <value>classpath:hibernate.cfg.xml</value> 
    </property>
4

4 回答 4

5

如果您想使用成熟且高性能的东西(例如,不是 Apache DBCP),请使用BoneCP

以下是您可以调整的选项:

<!-- BoneCP configuration -->
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
   <property name="driverClass" value="com.mysql.jdbc.Driver" />
   <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1/yourdb" />
   <property name="username" value="root"/>
   <property name="password" value="abcdefgh"/>
   <property name="idleConnectionTestPeriod" value="60"/>
   <property name="idleMaxAge" value="240"/>
   <property name="maxConnectionsPerPartition" value="30"/>
   <property name="minConnectionsPerPartition" value="10"/>
   <property name="partitionCount" value="3"/>
   <property name="acquireIncrement" value="5"/>
   <property name="statementsCacheSize" value="100"/>
   <property name="releaseHelperThreads" value="3"/>
</bean>

BoneCP论坛非常活跃,提交者反应非常迅速。

另一个您可以查看(可能会听到)的是C3PO,尽管 BoneCP 的性能好得多。

于 2012-03-19T01:14:46.163 回答
5

您可以使用 Apache DBCP,它应该是这样的替代品:

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="maxActive" value="10"/> 
    <property name="minIdle" value="5"/> 
    <!-- SELECT 1 is a simple query that returns 1 row in MySQL -->
    <property name="validationQuery" value="SELECT 1"/> 
</bean>

需要注意的几点

  • 您可以配置最大连接数。
  • 您可以配置最小空闲连接数。
  • 将执行以验证连接的查询仍然有效。

当验证发生时,还有更多选项可以配置。

于 2012-03-16T23:33:00.550 回答
2

基本上这取决于您的应用程序。

有以下条件(取自此处):

  1. 对于 J2EE 容器之外的测试或独立环境,请使用DriverManagerDataSource
  2. 对于在 J2EE 容器中使用,建议使用JNDI DataSource 容器提供的一个。
  3. 要在 J2EE 容器之外使用连接池数据源,请考虑 Apache 的 JakartaCommons DBCPC3P0.
于 2014-12-13T05:25:35.727 回答
2

Apache DBCP 是一个广泛使用的池。但不要使用它的选项testWhileIdle。启用后,它的后台 evictor 线程会在检查死连接时锁定所有正在服务的新连接。在任何非玩具环境中都是不可接受的。除此之外,我们没有任何问题。

您可能会在此 SO 线程中阅读有关池的更多信息,但请记住,所有关于“最快池”的火焰只有在特定负载下进行特定调整时才有意义。

于 2012-03-18T20:50:12.447 回答