在hibernate中打开会话是否必然意味着我与数据库有连接?

时间:2016-09-12 08:31:05

标签: java hibernate tomcat mariadb

出于测试目的,我将context.xml更改为

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
    maxActive="1" maxIdle="0" maxWait="10000"
    name="jdbc/ourDB" removeAbandoned="true"
    removeAbandonedTimeout="300" type="javax.sql.DataSource"
    url="jdbc:mysql://localhost:3306/db?useUnicode=true&amp;characterEncoding=utf8"
    username="root"
    password="something"
    validationQuery="select 1;" />

但是根据Eclipse中的调试器,两个线程同时有一个打开的会话。

这是根据

Session session = entityManager.unwrap(Session.class);
if (!session.isOpen()) {
        session = session.getSessionFactory().openSession();
        log.warn("initSessionIfClosed] Session was closed so it was reopened");
}

这实际上是可行的还是我以错误的方式调试某些东西(我在Eclipse中清理了项目,并且上下文似乎在本地部署)。

如有必要,我可以提供更多细节。

非常感谢。

更新

根据.hashCode,两个会话对象是不同的     mysqladmin -i 1 processlist

显示了两个过程。

+ ----- + ---------- + ----------- + ----------------- + --------- + ------ + ------- + ------------------ + ----- ----- + | Id |用户|主持人| db |命令|时间|国家|信息|进展| + ----- + ---------- + ----------- + ----------------- + - ------- ------ + ------- + + + ------------------ -------- - +

| 79 |根| localhost | |睡觉| 3501 | | | 0.000 |

| 133 |巴斯伦| localhost | |查询| 0 | init | show processlist | 0.000 |

| 174 |根| localhost | db |睡觉| 367 | | | 0.000 |

| 175 |根| localhost | db |睡觉| 416 | | | 0.000 |

+ ----- + ---------- + ----------- + ----------------- + --------- + ------ + ------- + ------------------ + ----- ----- +

那么,这可能是tomcat中的一个错误吗?

2 个答案:

答案 0 :(得分:1)

每个hibernate会话都等同于JDBC连接,实际上两个线程不应该访问JDBC连接,因为每个线程应该绑定到一个且只有一个数据库事务,因为hibernate会话不是线程安全的,你需要在这里设置一个合适的事务隔离级别。

答案 1 :(得分:0)

在这种情况下,原因似乎是我必须使用maxTotal而不是maxActive,因为我使用的是比Tomcat 7更新的Tomcat。