java - hibernate 中打开的 session 是否一定意味着我已连接到数据库?

标签 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 session = entityManager.unwrap(Session.class);
if (!session.isOpen()) {
        session = session.getSessionFactory().openSession();
        log.warn("initSessionIfClosed] Session was closed so it was reopened");
}

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

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

非常感谢。

更新:

根据.hashCode,这两个session对象是不同的, mysqladmin -i 1 进程列表

显示了两个进程。

+-----+---------+---------+------------- +--------+------+--------+----------------+----- -----+ |编号 |用户 |主持人 |分贝 |命令 |时间 |状态 |资讯 |进度 | +-----+------------+------------+----------------+-- ------+--------+--------+----------------+-------- --+

| 79 |根 |本地主机 | | sleep | 3501 | | | 0.000 |

| 133 |巴特伦 |本地主机 | |查询 | 0 |初始化 |显示进程列表 | 0.000 |

| 174 |根 |本地主机 |分贝 | sleep | 367 | | | 0.000 |

| 175 |根 |本地主机 |分贝 | sleep | 416 | | | 0.000 |

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

那么,这会不会是 tomcat 的一个错误?

最佳答案

每个hibernate session相当于一个JDBC Connection,一个JDBC Connection实际上不应该被两个线程访问,因为每个线程应该绑定(bind)到一个且唯一的数据库事务,因为hibernate session不是线程安全的,你需要在此处设置适当的事务隔离级别。

关于java - hibernate 中打开的 session 是否一定意味着我已连接到数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39446214/

相关文章:

java - 在 Tomcat 8 上使用 Mybatis、c3p0 启动 webapp 时出错

Java - 在网页上调用onclick方法

java - 如何使用 BlueJ 和 Wampserver 修复 "java.lang.ClassNotFoundException: com.mysql.jdbc.Driver"

java - Hibernate/JPA 刷新整个集合

java - Web 服务和 JPA

java - 如何使用 Azure DevOps 发布管道将 Java 应用程序部署到 Tomcat 8 App Service?

java - xslt 转换后为什么在 Tomcat/bin 文件夹中生成文件?如何将此目录更改为 webapps/myApp?

Java 动态名称

java - 如何将 wicket 组件插入 Wicket DataTable 的 'sub-rows'

java - Spring 使用 SpEL 主体