我应该为 Spring 3.1.0、Hibernate 4.0.1.Final 和 MySQL 5.1 使用啥池数据源?
Posted
技术标签:
【中文标题】我应该为 Spring 3.1.0、Hibernate 4.0.1.Final 和 MySQL 5.1 使用啥池数据源?【英文标题】:What pooled data source should I use for Spring 3.1.0, Hibernate 4.0.1.Final, and MySQL 5.1?我应该为 Spring 3.1.0、Hibernate 4.0.1.Final 和 MySQL 5.1 使用什么池数据源? 【发布时间】:2012-04-02 11:05:49 【问题描述】:我正在使用 Spring 3.1.0.RELEASE、Hibernate 4.0.1.Final 和 mysql 5.1。我应该使用什么汇集数据源?我目前正在使用(来自应用程序上下文文件的 sn-p)...
<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 应用程序上下文的 sn-p文件...)
<bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" id="sessionFactory">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
【问题讨论】:
【参考方案1】:您可以使用 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>
注意事项
您可以配置最大连接数。 您可以配置最小空闲连接数。 将执行以验证连接的查询仍然有效。验证发生时还有其他选项可供配置。
【讨论】:
现在 org.apache.commons.dbcp2.BasicDataSource【参考方案2】:Apache DBCP 是一个广泛使用的池。但是不要使用它的选项testWhileIdle
。启用后,它的后台 evictor 线程会在检查死连接时锁定所有正在服务的新连接。在任何非玩具环境中都是不可接受的。除此之外,我们没有任何问题。
您可以在this SO thread 中阅读有关池的更多信息,但请记住,所有关于“最快池”的言论只有在特定负载下进行特定调整时才有意义。
【讨论】:
【参考方案3】:如果你想使用成熟的 performant(例如,不是 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 forum 非常活跃,提交者反应非常迅速。
您可以查看(可能会听到)另一个是 C3PO,尽管 BoneCP 的性能很多更好。
【讨论】:
【参考方案4】:基本上这取决于您的应用程序。
有以下条件(取自here):
-
对于 J2EE 容器之外的测试或独立环境,请使用
DriverManagerDataSource
对于在 J2EE 容器中使用,建议使用JNDI DataSource
由容器提供。
要在 J2EE 容器之外使用连接池数据源,请考虑
Apache 的雅加达 Commons DBCP
或 C3P0
。
【讨论】:
以上是关于我应该为 Spring 3.1.0、Hibernate 4.0.1.Final 和 MySQL 5.1 使用啥池数据源?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Mvc Hibernate Encoding/多行导入sql