以下代码返回会话已关闭错误。从我的调试开始,我知道在执行此代码时会话已打开。在调试窗口中session.isOpen()
返回false,但在运行时session.isOpen()
抛出会话关闭错误。这里发生了什么......
public static List<List<Object>> getProjectInfo(String projectName) {
final List<List<Object>> list = new ArrayList<List<Object>>();
final String QUERY_STRING = HibernateUtil.getSqlFactory().getProperty("query")
final Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.doWork(new Work() {
public void execute(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(QUERY_STRING);
ResultSet rs = ps.executeQuery();
try {
while (rs.next()) {
List<Object> ele = new ArrayList<Object>();
//do some processing here
//...
list.add(ele);
}
session.getTransaction().commit();
} catch (HibernateException he) {
logger.error(logger.getClass() + he.getMessage() + he.getStackTrace());
session.getTransaction().rollback();
throw he;
} finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (session.isOpen()) {
session.close();
}
}
}
});
return list;
}
答案 0 :(得分:0)
实际上看起来我在那里有一个额外的事务提交。 woops!
答案 1 :(得分:0)
您可以按以下格式关注代码。
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
tx.setTimeout(5);
//doSomething(session);
tx.commit();
}catch(RuntimeException e){
try{
tx.rollback();
}catch(RuntimeException rbe){
log.error("Couldn’t roll back transaction", rbe);
}
throw e;
}finally{
if(session!=null){
session.close();
}
}
在Hibernate中,事务管理非常标准,只记得Hibernate抛出的任何异常都是FATAL,你必须立即回滚事务并关闭当前会话。