使用 Hibernate、c3p0、Guice 和 Guice-persist,我们遇到了奇怪的问题,即事务后数据连接没有释放到池中。
似乎它与JpaPersistService的完成方式有关,将 EntityManager 缓存在 threadLocal 变量中:
private final ThreadLocal<EntityManager> entityManager = new ThreadLocal<EntityManager>();
我的问题是:
- 我们是否应该删除 guice-persist 并将其替换为创建新 entityManager 的东西,然后在每次需要时关闭它(如此处建议)?
- 或者缓存 entityManager 是要走的路,我们应该用别的东西来解决我们的问题?
(我们的问题:1)mysqld在经典的8h超时后终止mysql连接,因此entityManager不再可用。可以通过开启c3p0 keep-alive来解决,但由于应用程序有时会长时间不使用,我们希望避免保持无用的活动连接。2)似乎每个EntityManager都做了一些缓存,entite在entityManager之间是不连贯的。没看怎么解决)