当前位置: 首页 > 面试题库 >

使用Spring和Hibernate在多个数据库中进行分布式事务的“最佳”方法是什么

阎麒
2023-03-14
问题内容

我有一个应用程序-更像是一个实用程序-它位于角落,并定期更新两个不同的数据库。

这是一个使用Spring Application
Context构建的小独立应用程序。上下文中配置了两个Hibernate会话工厂,依次使用Spring中配置的Commons DBCP数据源。

当前没有事务管理,但是我想添加一些。对一个数据库的更新取决于对另一个数据库的成功更新。

该应用程序不位于Java EE容器中,而是由从外壳程序脚本调用的静态启动器类引导的。启动器类实例化应用程序上下文,然后在其一个bean上调用一个方法。

围绕数据库更新进行事务处理的“最佳”方法是什么?

我将“最佳”的定义留给您,但我认为它应该具有“易于设置”,“易于配置”,“廉价”和“易于打包和重新分发”的功能。自然,FOSS会很好。


问题答案:

在多个数据库上分布事务的最佳方法是:不。

有人会将您指向XA,但XA(或“两阶段提交”)是一个谎言(或市场说法)。

想象一下:在第一阶段告诉XA管理器它可以发送最终提交之后,到其中一个数据库的网络连接失败。怎么办?超时?这将使另一个数据库损坏。回滚?两个问题:您无法回滚提交,又如何知道第二个数据库发生了什么?在成功提交数据后,网络连接失败了,只有“成功”消息丢失了吗?

最好的方法是将数据复制到一个地方。使用允许您中止副本并随时继续进行复制的方案(例如,忽略已拥有的数据或按ID排序选择,仅请求记录>副本的MAX(ID))。通过交易保护它。这不是问题,因为您只从源中读取数据,所以当事务由于任何原因失败时,您可以忽略源数据库。因此,这是一个普通的单源交易。

复制数据后,请在本地进行处理。



 类似资料:
  • 问题内容: 如果创建Oracle dblink,则无法直接访问目标表中的LOB列。 例如,使用以下命令创建一个dblink: 之后,您可以执行以下操作: 除非该列是LOB,否则您将收到错误: 这是有据可查的限制。 同一页上建议您将值提取到本地表中,但这有点…杂乱无章: 还有其他想法吗? 问题答案: 是的,这很混乱,不过我想不出办法避免这种情况。 您可以通过将临时表创建放入存储过程中(并使用“立即执

  • 问题内容: 我有mongodb和NodeJs。通过mongoosejs完成连接。 开发Ajax Infinity滚动的最佳方法是什么?我应该使用极限和偏移量吗? 问题答案: 当您对数据集进行分页时,“跳过并限制”方法不是很有效。它实际上是Shlemiel Painter的算法 。 范围查询效率更高(当索引支持时)。例如,假设您正在显示推文。您的页面大小是20,您在第1000页上,并且想要加载第10

  • 问题内容: 在我的项目中,我可以成功测试数据库代码。我正在使用Spring,Hibernate,HSQLDB,JUnit和Maven。 问题是,当前我必须在运行测试之前手动启动HSQLDB。使用所使用的技术自动启动HSQLDB的最佳方法是什么? 问题答案: 我假设与您一起指的是HSQLDB。 将JDBC驱动程序(用于hibernate等)的数据库URL配置为基于嵌入式内存的HSQLDB版本: 然后

  • 我需要从数据库中选择一百个参数,然后在d to返回它来创建一个excel文件。 我使用的是spring数据,我认为有两种解决方案: > 使用multiselect方法,然后在DTO中定义一个包含所有参数的构造函数(参数数大于100) 使用multiselect方法并将数组(Object[])映射到DTO= 请问你还有其他的想法吗? 谢谢。

  • 我在oracle中有两个数据源和两个模式,我正在执行unittest,但失败了。我想如果第二个事务失败,那么它应该回滚第一个TrasAction。下面是我的代码。 XML java.lang.IllegalStateException:无法激活事务同步-已在org.springframework.transaction.support.TransactionSynchronizationManag

  • 1. 前言 一个项目中使用多个数据源的需求,我们在日常工作中时常会遇到。 以商城系统为例,有一个 MySQL 的数据库负责存储交易数据。公司还有一套 ERP 企业信息化管理系统,要求订单信息同步录入 ERP 数据库,便于公司统一管理,而该 ERP 系统采用的数据库为 SQL Server 。 此时,就可以在 Spring Boot 项目中配置多个数据源。另外,使用多数据源后,需要采用分布式事务来保