Hibernate和mysql的连接太多了
我完全失去了,我正在使用hibernate和mysql运行一个批处理作业,几个小时后我得到一个exception,说我正在使用许多连接。 我已经阅读了关于SO的所有文章,但似乎没有与我有关。 我正在使用Tapestry-hibernate,配置非常简单, http://tapestry.apache.org/using-tapestry-with-hibernate.html 。 不管我在哪里创建一个新的SessionFactory,一旦应用程序启动,我只是将hibernate Session注入我的类。
这是我当前与mysql的连接视图。
我的批处理作业是线程化的,每次新线程触发时,threads_connected似乎都会增加。
我的cfg.xml文件。
jdbc/company validate false filesystem /users/george/Documents/indexes true false org.hibernate.cache.ehcache.EhCacheRegionFactory
类中基本会话使用的示例 – “请注意下面的代码不是生产代码,仅用于说明会话使用情况。
private final Session session; public LineReaderParserImpl(Session session) { this.session = session; } public void parse() { exec.submit(new Runnable() { public void run() { for (int i = 0; i < 10000; i++) { Object object = session.createCriteria()... session.save(object); session.getTransaction().commit(); if (currentRow % 250 == 0 || currentRow == totalRows) { try { session.getTransaction().commit(); } catch (RuntimeException ex) { try { session.getTransaction().rollback(); } catch (RuntimeException rbe) { throw ex; } finally { session.clear(); session.beginTransaction(); } } } } } }
tapestry-hibernate提供的hibernate会话是PerThread作用域。 PerThread作用域服务通过PerthreadManager.cleanupThread()进行清理。 Tapestry自动清理ParallelExecutor管理的请求线程和线程。 如果您正在管理自己的线程,则必须显式调用PerthreadManager.cleanupThread()。
考虑到Session对象不是线程安全的,也许你定义被注入的会话对象的方式有问题。
并不意味着实现者是线程安全的。 相反,每个线程/事务应从SessionFactory获取自己的实例。
- 如何在hibernate中使用条件对列表进行排序
- 将JPA与Hibernate实现一起使用:entityManager.remove – 不工作
- Hibernate和Spring事务 – 使用私有构造函数/静态工厂方法
- 如何在Hibernate中设置内部查询的限制?
- c3p0说 – “java.lang.Exception:DEBUG ONLY:过期资源检出堆栈跟踪”启动一个hibernate事务
- 使用Springs事务管理与使用hibernate的好处
- Hibernate(JPA)如何做一个急切的查询,加载所有子对象
- 多用户数据源 – Spring + Hibernate
- Hibernate包vs idbag