Spring JPA:从异步方法处理时数据未保存到数据库

2024-02-05

我有一个使用 Spring JPA 的应用程序,并使用 @Async spring 注释执行一些后台进程。该过程需要将参数保存在数据库中,或者如果参数已经存在则更新数据库。

这不能正常工作,因为在 @Async 方法完成后我的数据实体没有保留在数据库中。但是当我从方法中删除 @Async 注释时,一切正常。我的数据已保存或更新到数据库。

有谁知道可能出了什么问题或者我可能错过了什么?

Thanks.

** 更新 [代码示例]

异步服务

@Service
@EnableAsync
class AsyncService() {
    @Async
    public void process(firstEntity, secondEntity) {
        firstEntity = prepareParams(firstEntity);
        secondEntity = prepareParams(secondEntity);
        save(firstEntity, secondEntity);
    }
}

实体关系服务

@Transactional
@Service
class EntityRelationService() {

    private SecondEntityRepo secondEntityRepo;

    @Autowired
    public EntityRelationService(SecondEntityRepo secondEntityRepo) {
        this.secondEntityRepo = secondEntityRepo;
    }

    @Transactional
    public void save(p1, p2) {
        p2.setRelation(p1);

        this.secondEntityRepo(p2);
    }
}

豆配置

@Bean
@Primary
@ConfigurationProperties(prefix = "app.database")
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driver);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}

@Bean
@Primary
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sf = new LocalSessionFactoryBean();
    sf.setDataSource(dataSource());
    sf.setPackagesToScan("com.app");
    Properties props = new Properties();
    props.put("hibernate.use_sql_comments", false);
    props.put("hibernate.show_sql", true);
    sf.setHibernateProperties(props);
    return sf;
}

@Bean
public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager =
            new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory().getObject());
    return transactionManager;
}

我猜测 @Async 方法与 @Transactional 位于同一类中。

请注意:@Async 将创建一个不是事务性的新线程(因此不会写入数据库)。使用Spring代理的东西,你的异步方法需要调用另一个类上的方法才能恢复@Transactional。

换句话说,使用 @Async 方法创建一个新的空类,该方法仅调用原始类(具有 @Transactional)中的 main 方法。

一个简单的例子如下:

真实服务的代理:

@Service
@EnableAsync
class AsyncService() {
    private SyncService syncService;

    @Async
    public void process(String param) {
        syncService.process(param);
    }
}

以及真正的服务:

@Service
@Transactional
class SyncService() {
    public void process(String param) {
        // ... Do whatever you want
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring JPA:从异步方法处理时数据未保存到数据库 的相关文章

随机推荐

  • Android CoroutineScope 完成后自动取消

    我想知道是否coroutineScope工作完成后将自动取消 假设我创建了一个coroutineScope在自定义类中而不是 ViewModel类或Fragment Activity class class MyClass private
  • firebase存储cors奇怪的行为

    我正在构建一个应用程序 让用户看到一组缩小的图像 然后按 确定 让应用程序下载所有原始文件 将它们放入 zip 文件中并发送 zip 文件 该应用程序使用polymer polymerfire firebase 包括存储 在上传图像的过程中
  • 组合两个 Linq lambda 表达式

    Expression
  • 没有 AppBar 的 Flutter 布局

    我需要一个没有应用栏的布局 所以最明显的方法是省略appbar标签上的Scaffold但如果我这样做 内容就会出现在状态栏下方 如下所示 正如您所看到的 我的蓝色容器从状态栏下方开始 但事实并非如此 因此我必须手动设置容器的边距 这不太好
  • 在文件夹中查找最新文件并打开它(vba 访问)

    我正在尝试使用以下代码通过访问按钮宏打开文件夹中的最新文件 使用 if 语句进行测试 没有发现任何问题 但是一旦我使用了 do while 我就收到了运行时 6 溢出的错误消息 does len dir 不能使用循环 下面是我的代码 Pri
  • 在终端中,将多个文件夹合并为一个

    我有一个由 WDBackup 西部数据外置硬盘备份实用程序 创建的备份目录 其中包含每天备份的目录以及备份内容的增量内容 所以层次结构看起来像这样 20100101 My Documents Letter1 doc My Music Bes
  • 根据从 WSDL 中提取的多个模式验证 XML

    我尝试使用 SAAJ 手动处理 Web 服务请求 但仍然根据 Web 服务的 WSDL 架构验证接收到的请求 这个特定的 WSDL 包含多个元素 我使用 wsdl4j 提取这些元素 当我尝试创建新的验证器时 我收到一条错误消息 说明该验证器
  • Android:监听电源键按下

    我目前正在尝试监听何时按下电源按钮 最终 我希望在按两次电源按钮时运行一些代码 以检查屏幕是否锁定或解锁 我目前有这个 Override public void onCreate Bundle savedInstanceState supe
  • 在 datagridview 中右对齐列不起作用

    我有一个datagridiview这是动态绑定到datatable 我想将标题中的一些列右对齐 我尝试了这个设置datagridview对于单元格样式和标题单元格 对于单元格样式 它显示正确 但对于标题 它不是 我使用的代码 this da
  • 在 GitHub 中编辑 git 提交消息

    有没有办法在线编辑提交消息GitHub com 提交后 从命令行 人们可以做 git commit amend m New commit message 正如以下问题中正确建议的那样 如何修改现有的 未推送的提交消息 https stack
  • 如何防止表单被提交?

    我有一个表单 其中某处有一个提交按钮 但是 我想以某种方式 捕获 提交事件并防止其发生 我有什么办法可以做到这一点吗 我无法修改提交按钮 因为它是自定义控件的一部分 与其他答案不同 返回false只是part的答案 考虑一下在 return
  • 在 Yii 中创建三个以上表的关系

    当我尝试在 Yii 中创建三个以上表的关系时 以下方法给我带来了麻烦 public function relations return array info gt array self BELONGS TO Software ITEM ID
  • Swift 可以从异步 Void 返回块返回值吗?

    我想创建一个函数来检查 user id 是否已在我的数据库中 class func checkIfUserExsits uid String gt Bool userRef childByAppendingPath uid observeS
  • printf 的包装

    我在Arduino下编码 我想开发串行打印格式化功能 所以我尝试使用sprintf未知大小的缓冲区 基本上 我们可以避免谈论 Arduino 及其串行输出 并考虑将文本写入缓冲区 然后使用printf 我试过这个 include
  • matplotlib.mplot3d 立方体表面的底图

    正如标题所示 我试图在 matplotlib mplot3d 线图的 z 0 表面上绘制底图地图 我知道 Axes3D 对象能够在 z 0 表面上绘图 通过 Axes3D plot Axes3D scatter 等 但我不知道如何使用 Ba
  • 从一组坐标中找到最接近的坐标

    我有大约 1000 组地理坐标 纬度 经度 给定一个坐标 我想从该集合中找到最接近的一个 我的方法是测量距离 但每秒数百个请求对于服务器执行所有数学运算来说可能有点粗糙 对此最好的优化解决方案是什么 Thanks 您将想要使用 最近邻算法
  • 在 setter 方法的情况下,为什么 irb 会回显赋值的右侧而不是返回值?

    令人惊讶的是 在所有其他情况下 irb 都会回显方法的返回值 为什么通过 setter 进行分配的行为会有所不同 我正在使用 Ruby 2 2 2 irb main 001 0 gt def x value puts puts from x
  • 统计同一张表上多个条件的SQL

    我正在尝试编写一个查询 返回在 2020 年 1 月 1 日之后购买 镜子 或 自行车 并且在 12 个月内还购买了 书 或 沙发 的客户 使用计数以防他们购买多次 我编写的查询不完整 因此我需要一些帮助 我缺少计算未来 12 个月内订单数
  • 如何将 LINQ 查询相互附加?

    我有一个表单 可以根据他们选择的内容过滤数据 我正在尝试将 linq 查询相互附加 以便最终结果是他们在屏幕上选择的结果 这是我的代码 private void button Search Click object sender Event
  • Spring JPA:从异步方法处理时数据未保存到数据库

    我有一个使用 Spring JPA 的应用程序 并使用 Async spring 注释执行一些后台进程 该过程需要将参数保存在数据库中 或者如果参数已经存在则更新数据库 这不能正常工作 因为在 Async 方法完成后我的数据实体没有保留在数