与会话的异步服务

时间:2014-11-21 16:35:43

标签: java hibernate jdbc

我有一个方法可以调用存储的函数。我希望它能够异步并完成它的工作。这就是我所拥有的,但似乎永远不会启动.doWork(),因为当我调用getDao.deleteAll()时,存储的函数不会运行。

@Transactional
    public void delete()
    {

        final Session session = (Session) entityManager.getDelegate();
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.execute(new Runnable()
        {
            @Override
            public void run()
            {
                LOGGER.warn("starting");
                session.doWork(new Work()
                {
                    @Override
                    public void execute(Connection connection) throws SQLException
                    {
                        try
                        {

                            CallableStatement purgeArchived = connection.prepareCall("{call deleteAll()}");
                            purgeArchived.execute();
                        }
                        catch (SQLException exception)
                        {
                            LOGGER.warn("Failed to purge archive points. Reason: " + exception);
                        }
                    }
                });
                LOGGER.warn("stopping");
            }
        });
        executorService.shutdown();
    }

我看到记录器已记录"starting",但它永远不会"stopping"为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

请注意,当您拥有单独的线程时@Transaction没有意义,因为事务通常是线程绑定的。

您需要在run()内从工厂获取新的entityManager

还可以选择更清洁的@Async。

再次注意与@Async

的交易

@Async and @Transactional: not working

作为一般的经验法则,如果您想让某些工作异步 - 将其视为单个工作单元和单独的事务。