当我在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)
这是我的hibernate 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 :(得分:3)
根据Mapping MySQL Error Numbers to JDBC SQLState Codes,您获得的错误代码SQLState: 08S01
表明您用于数据库的主机名不正确。
首先请确保数据库主机: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 :(得分:1)
<强>更新强>
来自hibernate文档
然而,Hibernate自己的连接池算法非常简单 简陋。它旨在帮助您入门,而不是 打算用于生产系统,甚至用于性能 测试。您应该使用第三方池以获得最佳性能 稳定性。 只需替换hibernate.connection.pool_size属性即可 具有连接池特定设置。这将关闭Hibernate的 内部池。例如,您可能想使用c3p0。
因此,在使用c3p0连接池时,无需指定hibernate连接池大小属性
答案 2 :(得分:0)
记住提交和关闭会话。可能是你没有提交,Hibernate在连接超时后尝试回滚。
了解如何访问数据库会很有帮助,请发布一些代码。