我有一个存储函数可以从数据库中删除一些东西,但由于它可能是一个非常长的任务,我想创建一个线程来执行这个函数,并让用户继续做他正在做的事情。 / p>
目前我有以下内容:
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);
}
}
});
}
我害怕当我在休息服务中调用getDao.deleteAll()时,如果数据库有很多要删除的东西,这将会工作很长时间。如何创建一个线程来做同样的事情?或者这会创建一个线程并执行函数吗?
答案 0 :(得分:1)
是的,您需要为此创建自己的主题。可能最简单的方法是将当前deleteAll()
方法的整个主体复制到新类的run()
方法,该方法扩展Thread
。假设您已经调用了该类DeleteAllThread
,那么您将使用
@Override
public void deleteAll() {
new DeleteAllThread().start();
}
答案 1 :(得分:0)
另一个选择是使用ExecutorService。这可能会让事情变得更加清洁。 Here是如何使用ExecutorService的一个简单示例。