[英]Hibernate + PostgreSQL - Connection with state “Idle in transaction”
我有一个使用Hibernate在Tomcat上运行的JSF应用程序。 我做了一个小测试,暴露了te问题 - 创建了一个servlet,它唯一做的就是:
EntityManager em=null;
try {
em = ConnectDb.getEntityManager();
em.createQuery("from Frete").getResultList();
} catch (Exception e) {
e.printStackTrace();
} finally {
try{em.close();}catch(Exception ex){}
}
如果我在pg_admin中执行以下sql,我得到一条记录,在“查询”列中我看到由hibernate执行的sql,在“state”列中它显示“在事务中空闲”。
但问题是没有启动任何事务,我唯一做的就是创建一个查询。 并且EntityManager已关闭 - 关闭它时没有抛出异常。
也许这是persistence.xml的配置,但我不知道。 这是我的persistence.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="GestaoPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.connection.autocommit" value="false"/>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/AtualyGestao"/>
<property name="javax.persistence.jdbc.password" value="atg4747"/>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.user" value="AtualyGestao"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.connection.encoding" value="ISO-8859-1"/>
</properties>
</persistence-unit>
</persistence>
我唯一做的就是创建一个查询
看来你也执行它:
em.createQuery(“来自Frete”)。 getResultList();
执行此行时:hibernate执行查询并执行此操作,事务由postgresql驱动程序创建。
由于自动提交设置为false:
<property name="hibernate.connection.autocommit" value="false"/>
然后事务没有被提交,这就是你收到这条消息的原因。
BTW:而不是
try{em.close();}catch(Exception ex){}
写这个:
try{em.close();}catch(Exception ex){ex.printStacktrace();}
我知道这是一篇非常古老的帖子。 编写我的解决方案只是为了帮助目前正面临这个问题的其他人。 我最近也遇到过这个问题。 当我调试更多时,我开始知道即使在选择查询的情况下,hibernate也会自动创建事务。 而且它没有正确地提交/回滚查询。 因此,我明确添加了启动和停止事务的代码,这解决了这个问题。 所以代码看起来像这样:
SessionPersister session = CommonSessionPersisterFactory.INSTANCE.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
//do the query or update.
transaction.commit();
}
catch(Exception re){
transaction.rollback();
}
finally {
if(session != null){
Transaction tran = session.getTransaction();
if(tran != null && tran.isActive() && !tran.wasCommitted() && tran.wasRolledBack()){
tran.rollback();
}
session.close();
}
我也在多个地方遇到过这个问题。 后来用JDBC替换了Hibernate,再也没有遇到过这个问题!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.