我有一個存儲函數,它將從數據庫中刪除某些東西,但由於它可能是一個非常長的任務,我想讓一個線程執行此函數,並讓用戶繼續做他在做的事情。創建一個線程來運行Postgres存儲函數
目前,我有以下幾點:
的DAO:
@Override
@Transactional
public void deleteAll()
{
Session session = (Session) entityManager.getDelegate();
session.doWork(new Work()
{
@Override
public void execute(Connection connection) throws SQLException
{
try
{
// stored function is currently named delete_function()
CallableStatement deleteAll= connection.prepareCall("{call delete_function()}");
purgeArchived.execute();
purgeArchived.close();
}
catch (SQLException exception)
{
LOGGER.warn(exception);
}
}
});
}
我怕當我在REST服務調用getDao.deleteAll(),這將是在一個很長的時間,如果工作數據庫有很多東西要刪除。我如何創建一個線程來做同樣的事情?或者這會創建一個線程並執行該功能?
小心使用Hibernate時創建線程。由於OP沒有解釋事務管理是如何完成的,所以創建一個Hibernate將執行其方法的線程可以在公共事務管理器的外部,並且該事務在執行後將被回滾。 – 2014-11-20 20:42:04
好點,@LuiggiMendoza。很顯然,我希望這能夠奏效。但我認爲OP的最佳做法是非常仔細地進行測試,無論是在其他交易都承諾並且其他交易失敗的情況下。 – 2014-11-20 20:57:04
你能解釋一下你的評論嗎?執行後回滾?對不起@LuiggiMendoza – PhoonOne 2014-11-20 21:18:59