【问题标题】:Spring + Hibernate + DBCP configuration issueSpring + Hibernate + DBCP 配置问题
【发布时间】:2015-01-13 06:59:48
【问题描述】:

我有一个简单的应用程序来演示 Spring 和 Hibernate 的集成。 howtodoinjava - link.

我的 pom.xml 中有 commons-dbcp 和 commons-pool 依赖项,都是 1.4 版

以下是我的休眠配置:

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.provider_class">
            com.brs.dao.DBCPConnectionProvider
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">****</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">create</property>
        <property name="hibernate.dbcp.initialSize">8</property>
        <property name="hibernate.dbcp.maxActive">20</property>
        <property name="hibernate.dbcp.maxIdle">20</property>
        <property name="hibernate.dbcp.minIdle">0</property>
        <property name="hibernate.dbcp.validationQuery">SELECT 1</property>

        <mapping class="com.brs.entity.EmployeeEntity"/>
    </session-factory>
</hibernate-configuration>

我已经按照以下教程进行操作

http://www.mkyong.com/hibernate/how-to-configure-dbcp-connection-pool-in-hibernate/ 

配置池。当我运行应用程序时,我得到以下日志

11:42:11,259 INFO  [com.brs.dao.DBCPConnectionProvider] (http--127.0.0.1-8080-1) active: 1 (max: 20)   idle: 7(max: 20)
11:42:11,263 INFO  [stdout] (http--127.0.0.1-8080-1) Hibernate: select employeeen0_.f_id as f1_2_, employeeen0_.f_email as f2_2_, employeeen0_.f_first_name as f3_2_, employeeen0_.f_last_name as f4_2_, employeeen0_.f_telephone as f5_2_ from t_employee employeeen0_
11:42:11,273 INFO  [com.brs.dao.DBCPConnectionProvider] (http--127.0.0.1-8080-1) active: 0 (max: 20)   idle: 8(max: 20)

这是预期的行为,因为空闲连接数为 8。但是,当我使用 MySql Workbench 时,show processlist; 我看到多达 18 个连接(2 个默认值 + 16 个应用程序)。

应用程序只是在数据库中保存一个对象。就这样。那为什么 Workbench 显示 16 个连接,而应用程序的日志显示只有 8 个连接空闲?当我停止应用程序服务器时,工作台中与同一模式的连接数为 2(默认)。这是什么意思呢? 有人可以解释发生了什么吗?

更新:抱歉,连接提供程序的软件包名称具有误导性。由于我已从以下链接复制代码,因此我的 IDE 已更改包名称。
连接提供者链接是http://wiki.apache.org/commons/DBCP/Hibernate

【问题讨论】:

  • 您的配置中允许 20 个连接。您允许 20 个连接空闲。在我看来,您的池将从 8 个连接开始,最多打开 12 个连接。
  • @Hannes 正确。但是为什么 MySql 工作台在睡眠模式下显示 16 个连接,而应用程序最初只创建 8 个?还是我错过了什么?
  • 对不起。我不认识您的 dbac 提供程序类。看看它。也许它会根据您的配置计算实际的池大小,或者有一个默认值。
  • Hannes 是对的,我也能认出你的 dbcp 提供者。顺便说一句,不要使用 root 用户连接到数据库。如果我没记错的话,如果出现问题并且您在数据库配置中访问了max_connections,那么root 用户(或任何具有超级权限的用户)始终可以连接到数据库。使用 root 用户将阻止您访问最后一个连接。

标签: java mysql spring hibernate mysql-workbench


【解决方案1】:

我解决了连接池中初始连接数翻倍的问题。该问题与提到的站点的示例代码有关。它对 Spring 上下文的配置有误。 Application ContextMVC Context 中包含相同的 xml 文件。在浪费了很多时间之后我注意到了它。

BasicDataSource 被实例化了两次。所以,有双倍的连接数。 再次证明不要盲目相信没有一定标准的教程。应该遵循 StackOverflow 和相应 API 的官方文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2015-01-22
    • 2012-05-13
    相关资源
    最近更新 更多