2016-09-29 36 views
0

您好,我有以下結構,它運行原始查詢,然後保存結果。但是,當一個異常的原始查詢occoured,我無法保存我的對象更多,表明錯誤發生當前交易發生錯誤後保存對象

[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

爲什麼不使用Spring Data JPA?你爲什麼試圖自己訪問連接? –

+0

,因爲我用jdbc運行批量更新,我認爲原始查詢不是問題 – wutzebaer

回答

0

1)看起來您在發生錯誤後沒有釋放與連接池的連接並試圖重用它。

2)而不是final Session session = getCurrentSession()創建使用的openSession(),如下一個新的會話:

SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory(); 
final Session session = sessionFactory.openSession(); 

盡力爲每個事務創建新的會話,如果使用getCurrentSession並出現任何錯誤或不在事務,那麼會話對象的維護(關閉/刷新等)是由休眠而不是由程序員完成的。對單線程環境使用getCurrentSession

3)默認情況下,Connection對象處於自動提交模式,這表示它在執行每個語句後自動提交更改。檢查你是否改變了它的財產?使用Connection.commit()來提交連接。

+0

抱歉,編寫示例代碼時出現這個錯誤,錯誤仍然存​​在 – wutzebaer

+0

檢查設置爲catch塊和myDao中作業對象的狀態。通過調試保存(作業)。檢查控制是否通過catch塊。 –

+0

是的,它的工作原理,錯誤發生在myDao.save(job); – wutzebaer

相關問題