当前位置: 首页 > 知识库问答 >
问题:

具有会话的异步服务

古起运
2023-03-14

我有一个方法要调用一个存储函数。我希望它异步地完成它的工作。这就是我所拥有的,但似乎.doWork()从未启动,因为当我调用<code>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();
    }

我看到记录器已经记录了“启动”,但它从未到达“停止”为什么会发生这种情况?

共有1个答案

贾实
2023-03-14

请注意,当您有一个单独的线程时,@Transaction是没有实际意义的,因为Transaction通常是线程绑定的。

您将需要在run()中从工厂获取一个新的entityManager

也可以选择@Async,它要干净得多。

再次注意@Async的事务性

@Async和@Transactional:不起作用

作为一个通用的经验法则,如果你想做一些异步工作——把它当作一个单独的工作单元和一个单独的事务。

 类似资料:
  • 问题内容: 我想对不带数字键()的mongoDB集合执行迭代。集合只有一个随机字符串作为_id,并且集合的大小很大,因此使用来将整个文档加载到RAM 上不是可行的选择。另外,我想对每个元素执行异步任务。的使用或者,是因为任务的异步性质的限制。我尝试使用上述方法运行任务,但它确实与异步任务冲突,返回了未完成的承诺而不是正确的结果。 例 我怎样才能仅使用mongoDB集合进行迭代? 问题答案: 该方法

  • 异步Tcp客户端 异步Http客户端 异步Redis客户端 异步Mysql客户端 异步Log日志 异步文件读写 异常Exception

  • 我对Java比较陌生。。 我正在编写一个Android应用程序,现在我将回顾我的代码,整理并坚持我的编码结构,使之更符合最佳实践风格。 我正在构建我认为合适的方法和类,以避免产生大量重复代码。我发现自己正在尝试创建一个类(例如HeavyStuff.java),其中包含几个AsyncTask方法(例如MyTask1和MyTask2)。从活动调用类时,我希望在某个点执行MyTask1,在其他点执行My

  • 异步Log日志 use AsyncLog; yield AsyncLog::info('hello world'); yield AsyncLog::debug('test debug', ['foo' => 'bar']); yield AsyncLog::notice('hello world',[], 'group.com'); yield Async

  • 问题内容: 所以我试图使这种形式异步。理想情况下,我使用此表单添加单位,然后动态更新表。我不希望整个页面刷新。我对javascript不太满意,可以对发生的事情使用一些指针: 我不想发生的一些事情正在发生: 整个页面令人耳目一新 request.is_ajax()为False。 通常,我只是想了解发生了什么,但问题是,如何更改以下内容以解决上述两个问题?(如果它们是问题,那么根本就是问题。) 作为

  • C Async描述了如何创建一个异步服务器和一个相应的异步客户机来与之通信。我已经在微软ViualStudio中创建了这个。 我现在需要一个java客户端说话的C服务器-我无法找到一个Java等效的客户端(到C)与C通信。 任何指点都将不胜感激