2013-08-16 138 views
1

當我在java swing中運行我的hibernate項目時,它首先起作用。但當我等待一段時間,我收到像org.hibernate.TransactionException錯誤:回滾失敗..告訴我一個解決方案。休眠異常:事務回滾失敗

這裏是我的錯誤

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(); 
+0

請...任何一個可以幫助我.... –

+0

爲什麼是大小爲1的連接池任何例外? –

+0

然後我可以設置池大小? –

回答

3

您得到的錯誤代碼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(); 
} 
1

看起來像這個問題與Mysql連接超時,猜猜會有默認超時的Mysql。請參閱這篇文章可以幫助你Hibernate Broken pipe

UPDATE
從休眠文件

Hibernate自己的連接池算法,然而,相當 簡陋。它旨在幫助您開始使用,而不是用於生產系統的 ,或者甚至用於測試的性能 。您應該使用第三方池以獲得最佳性能和穩定性。 只需將hibernate.connection.pool_size屬性 替換爲連接池特定設置即可。這將關閉休眠的 內部池。例如,您可能喜歡使用c3p0。

所以你沒有必要當您使用C3P0連接池

0

記住犯和關閉會話指定休眠連接池的大小屬性。這可能會導致你不提交,並且Hibernate在連接超時後嘗試回滾。

這將有助於看到你如何訪問數據庫,請張貼一些代碼。