【问题标题】:hibernate exception: transaction roll back failed休眠异常:事务回滚失败
【发布时间】:2013-08-18 10:59:54
【问题描述】:

当我在 java swing 中运行我的休眠项目时,它首先可以工作。但是当我等待一段时间后,我收到了类似 org.hibernate.TransactionException: rollback failed 之类的错误。告诉我一个解决方案。

这是我的错误

Aug 16, 2013 10:52:21 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 0, SQLState: 08S01
Aug 16, 2013 10:52:21 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Communications link failure
The last packet successfully received from the server was 89,371 milliseconds ago. 
The last packet sent successfully to the server was 1 milliseconds ago.
Exception in thread "AWT-EventQueue-0" org.hibernate.TransactionException: rollback  failed
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:215) at com.softroniics.queenpharma.services.PurchaseOrderService.showAllPurchase(PurchaseOrderService.java:131)

这是我的休眠 cfg 文件

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD  3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://queenpharma.db.11583306.hostedresource.com/queenpharma</property>
    <property name="connection.username">queenpharma</property>
    <property name="connection.password">Queenpharma#1</property>
    <property name="connection.pool_size">1</property>
    <property name="hbm2ddl.auto">update</property>
    <property name="show_sql">true</property>
    <property name="connection.autocommit">false</property>

    <property name="hibernate.c3p0.max_size">1</property>
    <property name="hibernate.c3p0.min_size">0</property>
    <property name="hibernate.c3p0.timeout">5000</property>
    <property name="hibernate.c3p0.max_statements">1000</property>
    <property name="hibernate.c3p0.idle_test_period">300</property>
    <property name="hibernate.c3p0.acquire_increment">1</property>

    <property name="current_session_context_class">thread</property>
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <mapping class="com.softroniics.queenpharma.model.LoginModel" />
    <mapping class="com.softroniics.queenpharma.model.PurchaseCompanyModel" />

---- 等等-----

这是我的一些代码

        session = sessionFactory.openSession();
    StockModel stockModel = null;
    try {
        tx = session.beginTransaction();
        Iterator<StockModel> iterator = session
                .createQuery("FROM StockModel where productid='" + id + "'")
                .list().iterator();
        if(iterator.hasNext()){
        stockModel = iterator.next();
        }

    } catch (HibernateException e) {
        if (tx != null)
            tx.rollback();
        e.printStackTrace();
    } finally {
         session.close();

【问题讨论】:

  • 请...任何人帮助我....
  • 为什么你的连接池大小为 1?
  • 那么我可以设置什么作为池大小??
  • 1 可以用于测试目的
  • @ShakeebManjeri 你试过删除默认连接池大小属性吗???

标签: java mysql swing hibernate


【解决方案1】:

您收到的错误代码SQLState: 08S01 表明您用于数据库的主机名根据Mapping MySQL Error Numbers to JDBC SQLState Codes 不正确。

所以首先请确保数据库主机:queenpharma.db.11583306.hostedresource.com 拼写正确。

如果错误仍然存​​在,请修改您的异常处理程序以捕获由回滚语句引起的异常,如下所示,以便您能够首先了解导致回滚的原因。

注意:您应该这样做只是为了解决此问题。在生产环境中,您不想浅显任何异常

} catch (HibernateException e) {
    if (tx != null) {
        try {
            tx.rollback();
        } catch(Exception re) {
            System.err.println("Error when trying to rollback transaction:"); // use logging framework here
            re.printStackTrace();
        }
    }
    System.err.println("Original error when executing query:"); // // use logging framework here

    e.printStackTrace();
}

【讨论】:

    【解决方案2】:

    似乎是Mysql连接超时的问题,猜猜Mysql会有默认超时。参考这篇文章可能对你有帮助Hibernate Broken pipe

    更新
    来自hibernate文档

    然而,Hibernate 自己的连接池算法相当 初级的。它旨在帮助您入门,而不是 用于生产系统,甚至用于性能 测试。您应该使用第三方池以获得最佳性能和 稳定。 只需替换 hibernate.connection.pool_size 属性 具有连接池特定设置。这将关闭休眠的 内部池。例如,您可能喜欢使用 c3p0。

    所以你在使用 c3p0 连接池时不需要指定休眠连接池大小属性

    【讨论】:

      【解决方案3】:

      记住提交和关闭会话。可能是你没有提交,Hibernate 在连接超时后尝试回滚。

      了解您如何访问数据库会很有帮助,请发布一些代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        • 2014-06-09
        • 1970-01-01
        • 2010-11-02
        • 2013-10-16
        相关资源
        最近更新 更多