出于测试目的,我将 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&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/