出于测试目的,我将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 = 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中的一个错误吗?
答案 0 :(得分:1)
每个hibernate会话都等同于JDBC连接,实际上两个线程不应该访问JDBC连接,因为每个线程应该绑定到一个且只有一个数据库事务,因为hibernate会话不是线程安全的,你需要在这里设置一个合适的事务隔离级别。
答案 1 :(得分:0)
在这种情况下,原因似乎是我必须使用maxTotal而不是maxActive,因为我使用的是比Tomcat 7更新的Tomcat。