您好我有以下构造,它运行原始查询然后保存结果。但是当原始查询出现异常时,我无法再保存我的Object以表明发生了错误
[c3p0] A PooledConnection that has already signalled a Connection error is still in use!
课程:
@Service("myService")
@Transactional(propagation = Propagation.REQUIRED)
public class MyService {
cron(){
Job job = myDao.nextJob();
try {
myDao.myFunction(job);
job.setStatus(Status.COMPLETE);
} catch (Exception e) {
job.setStatus(Status.ERROR);
}
myDao.save(job);
}
}
@Repository("myDao")
public class MyDao extends HibernateDaoSupport {
@Autowired
public void setHibernateSessionFactory(@Qualifier("sessionFactory") SessionFactory sessionFactory) {
setSessionFactory(sessionFactory);
}
public void myFunction(final Job job) {
final Session session = getCurrentSession();
session.flush();
session.doWork(new Work() {
@Override
public void execute(Connection con) throws SQLException {
// do something which creates an SQL error
}
}
}
}
如何才能获得新的工作会话以保存我的对象?
答案 0 :(得分:0)
1)看起来您在发生错误后没有释放与连接池的连接,并尝试重用它。
2)而不是final Session session = getCurrentSession()
使用openSession()创建一个新会话,如下所示:
SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory();
final Session session = sessionFactory.openSession();
尝试为每个事务创建新会话,如果使用getCurrentSession
且事务中是否发生任何错误,则会话对象的维护(关闭/刷新等)由hibernate完成,而不是由程序员。将getCurrentSession
用于单线程环境。
3)默认情况下,Connection对象处于自动提交模式,这意味着它在执行每个语句后自动提交更改。检查您是否更改了其财产?使用Connection.commit()
提交连接。