在当前事务中发生错误后保存对象

时间:2016-09-29 12:31:34

标签: spring hibernate transactional

您好我有以下构造,它运行原始查询然后保存结果。但是当原始查询出现异常时,我无法再保存我的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
            }
        }
    }

}

如何才能获得新的工作会话以保存我的对象?

1 个答案:

答案 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()提交连接。