JDBC rollback failed, Hibernate出错,求解!求解!

bobre 2007-07-09 05:56:06
我是一名新手,最近用struts+hibernate+tomcat写了一个简单的程序,有登录功能。
可如果服务器一天没关,到了第二天,或者是手动修改一下系统日期,服务器就是报以下错误:
org.hibernate.TransactionException: JDBC rollback failed
org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:170)
cg.DBOperate.getUser(DBOperate.java:31)
cg.LoginAction.execute(LoginAction.java:28)


下面把代码简单写一下
=======hibernate.cfg.xml=================
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">pwd</property>
<property name="hibernate.connection.pool_size">100</property>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Mapping files -->
<mapping resource="model.hbm.xml"/>
</session-factory>
</hibernate-configuration>

===========================LoginAction.java==========================
public final class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

DynaActionForm loginForm = (DynaActionForm) form;
String name = (String)loginForm.get("name");
String pwd = (String)loginForm.get("pwd");

User user = new DBOperate().getUser(name);
ActionMessages messages = new ActionMessages();

if (user == null) {
ActionMessage errors = new ActionMessage(
"LoginAction.fail.username", name);
messages.add("username", errors);
saveErrors(request, messages);
return mapping.findForward("fail");
}

String dbPassword = user.getPwd();
if (dbPassword == null || !dbPassword.equals(pwd)) {
ActionMessage errors = new ActionMessage(
"LoginAction.fail.password");
messages.add("password", errors);
saveErrors(request, messages);
return mapping.findForward("fail");
}

Organ organ = user.getOrgan();

HttpSession session = request.getSession();
session.setAttribute(Constants.LOGIN_USER_KEY, user); session.setAttribute(Constants.USER_ORGAN_KEY, organ);
return (mapping.findForward("successed"));
}
}
========================DBOperate.java===============================
public User getUser(String userId) throws HibernateException {
Session session = HibernateUtil.currentSession();
User user = null;
System.out.println(">>DbOperate.getUser");
Transaction tx = null;
try {
tx = session.beginTransaction();
Query q = session.createQuery("from User where name=:userId");
q.setParameter("userId", userId);
List list = q.list();
if (!list.isEmpty())
user = (User) list.get(0);
tx.commit();
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
throw e;
}
session.close();
return user;
}

=====================HibernateUtil.java==============================
public class HibernateUtil {
private static Log log = LogFactory.getLog(HibernateUtil.class);
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
ex.printStackTrace();
//log.error("Initial SessionFactory creation failed.", ex);
throw new ExceptionInInitializerError(ex);
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException {
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null||!s.isOpen()) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}

=============================
提示的错误是在DBOperate.java里的tx.rollback();

这个问题已经困扰我好一个星期,请哪位知道的大侠帮忙解决一下。先谢谢了~~
...全文
3100 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
A9112003 2010-12-30
  • 打赏
  • 举报
回复
靠。。。又是一个误解帖子
hzj7390711 2010-07-31
  • 打赏
  • 举报
回复
关注....小弟同样遇到这样的问题.希望高手能提供解决方法
lee603 2009-02-05
  • 打赏
  • 举报
回复
我也出现了类似的问题,就是用jdbc没有问题,而用jndi就有问题了
maplehjn 2008-07-11
  • 打赏
  • 举报
回复
我也是遇到类似的问题,在服务器上发现数据库端口有很多 CLOSE_WAIT的连接,是不是和这个有关?
zhonghuabao 2007-07-13
  • 打赏
  • 举报
回复
关注
blacksun8334 2007-07-12
  • 打赏
  • 举报
回复
UP
chenwanchun 2007-07-12
  • 打赏
  • 举报
回复
个人觉得最有可能的也是关闭Session这里的问题,当发生异常的时候没有关闭Session,这样就有可能导致数据库连接不能释放,到最后可能就没有数据库连接可用了。就像sureyor() 所说,你可以吧session的关闭放在finally中再试试。
sureyor 2007-07-12
  • 打赏
  • 举报
回复
你发生异常后没有关闭session
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
throw e;
}
应该加入
finally {
HibernateUtil.closeSession();
}
summerice110 2007-07-11
  • 打赏
  • 举报
回复
uP
bobre 2007-07-11
  • 打赏
  • 举报
回复
谢谢sureyor,不过我是没有用到spring的,仅仅是用到了struts+hibernate
另外查询不需要事务处理的话,那么在后续的操作还是需要事务的,比如插入。
我想这个问题并不是因为使用事务而出的错,主要还是Session使用时有问题。我用断点跟踪了一下,发现是DBOperate.java里的这一句List list = q.list();抛出的错误。
还请各位帮助找到真正的问题
自然80 2007-07-10
  • 打赏
  • 举报
回复
错误信息是什么(堆栈)
chumignze 2007-07-10
  • 打赏
  • 举报
回复
我感觉应该是tx.rollback();的问题,应该不需要这句话,当不成功的话,就不会执行tx.commit();你可以把这句话去掉试试
sureyor 2007-07-10
  • 打赏
  • 举报
回复
1.你只是查询,查询还需要事务处理吗?
2.你可以在配置文件中配置上事务处理的相关内容,那样就不需要在程序中进行明码的事务处理啦
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
autowire="byName" />
<bean id="matchAllWithPropReq"
class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource">
<property name="transactionAttribute">
<value>PROPAGATION_REQUIRED</value>
</property>
</bean>
<bean id="matchAllTxInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributeSource">
<ref bean="matchAllWithPropReq" />
</property>
</bean>
bobre 2007-07-09
  • 打赏
  • 举报
回复
好像是Session有问题,但又不知道如何解决
suifengxing 2007-07-09
  • 打赏
  • 举报
回复
有没有可能是会话时间过长的问题,我也不太清楚。
zjf405 2007-07-09
  • 打赏
  • 举报
回复
不懂,帮顶

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧