创建一个运行Postgres存储函数的线程

时间:2014-11-20 20:26:36

标签: java postgresql thread-safety

我有一个存储函数可以从数据库中删除一些东西,但由于它可能是一个非常长的任务,我想创建一个线程来执行这个函数,并让用户继续做他正在做的事情。 / 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()时,如果数据库有很多要删除的东西,这将会工作很长时间。如何创建一个线程来做同样的事情?或者这会创建一个线程并执行函数吗?

2 个答案:

答案 0 :(得分:1)

是的,您需要为此创建自己的主题。可能最简单的方法是将当前deleteAll()方法的整个主体复制到新类的run()方法,该方法扩展Thread。假设您已经调用了该类DeleteAllThread,那么您将使用

替换上面的方法
@Override
public void deleteAll() {
    new DeleteAllThread().start();
}

答案 1 :(得分:0)

另一个选择是使用ExecutorService。这可能会让事情变得更加清洁。 Here是如何使用ExecutorService的一个简单示例。