【发布时间】:2013-11-12 07:06:03
【问题描述】:
我完全不知所措,我正在使用 hibernate 和 mysql 运行批处理作业,几个小时后我收到一个异常,说我正在使用许多连接。我已经阅读了所有关于 SO 的文章,但似乎没有一篇与我有关。我正在使用具有非常简单配置的 Tapestry-hibernate,http://tapestry.apache.org/using-tapestry-with-hibernate.html。不,我在哪里创建一个新的 SessionFactory,一旦应用程序启动,我只需将休眠会话注入我的类。
这是我当前与 mysql 的连接视图。
我的批处理作业是线程化的,每次启动新线程时,threads_connected 似乎都会增加。
我的 cfg.xml 文件。
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.datasource">jdbc/company</property>
<property name="hbm2ddl.auto">validate</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.search.default.directory_provider">filesystem</property>
<property name="hibernate.search.default.indexBase">/users/george/Documents/indexes </property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">false</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
</session-factory>
类中基本会话使用示例-“请注意以下代码不是生产代码,仅用于说明会话使用。
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();
}
}
}
}
}
}
【问题讨论】:
-
为什么最后会有`session.beginTransaction();` - 你不想关闭
-
当我关闭它时它崩溃了,所以我开始下一次迭代的事务。这是不正确的吗?严重:空 org.hibernate.SessionException:会话已关闭!在 org.hibernate.internal.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:129) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:731) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:727) ) at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:723) at $Session_1332660432a2a61f.saveOrUpdate(Unknown Source) at $Session_1332660432a2a5de.saveOrUpdate(Unknown Source)
-
这是错误的。关闭您的连接(释放到池)并在使用它之后(不是最终)并在需要使用之前打开它(从池中获取)。
-
@user2310289 我修复了与此处找到的最佳答案 stackoverflow.com/questions/16593965/… 匹配的事务,这似乎解决了连接的递增线程,现在我只需要解决递增连接。这可能是chandan回答的结果。
标签: java mysql hibernate tapestry