【问题标题】:Abstract Routing Data source in Spring batchSpring批处理中的抽象路由数据源
【发布时间】:2014-02-25 11:02:59
【问题描述】:

我正在尝试在我的 spring 批处理应用程序中实现 AbstractRoutingDatasource。 在调用该方法之前,我的数据源在 DAO 层进行了切换。

但问题似乎是 spring-batch 中的所有批处理作业都是基于事务的。 由于它们是基于事务的,所有数据源都在事务开始之前设置,并且不可能在事务中间切换数据源..

我的假设是否正确?以及解决它的任何解决方案/解决方法?

【问题讨论】:

  • 这在任何基于 Spring 的应用程序中都不起作用。您需要在事务开始之前设置路由参数。所以是的,你的假设是正确的。
  • 这在任何基于 Spring 的应用程序中都不起作用。您的意思是 Spring 批处理吗?但是批处理作业呢?抽象路由数据源永远不能应用于spring-batch??
  • 也许这可以工作,但你必须使用 XA 跨越 tx;我没用过看看stackoverflow.com/questions/14369876/…
  • 我指的是任何基于 Spring 的通用应用程序(不仅仅是基于 spring-batch 的)。 事务管理器启动事务时,从数据源请求JDBC连接。所以路由只能在 TX 启动时发生。
  • 顺便说一句。查看这篇关于 spring-batch 中事务处理的精彩文章(如果您还没有阅读它们)-blog.codecentric.de/en/2012/03/…(不要忘记阅读第 2 部分和第 3 部分)。在 sprgin-batch 中有几个地方可以做“TX 魔术”。

标签: spring spring-batch


【解决方案1】:

使用路由数据源需要一个映射,该映射提供您选择的键和数据源的值。您决定使用哪种类型的密钥 - 例如不同国家/地区的区域设置。然后在实现 AbstractRoutingDataSource 的类中,您提供从数据源映射中检索的键。

所以是的 - 地图是在应用程序设置期间配置的,但您的 AbstractRoutingDataSource 会动态决定使用哪个数据源。

@Override
protected Object determineCurrentLookupKey() {
    return LocaleContextHolder.getLocale();
}

【讨论】:

  • 我很清楚如何根据key切换数据源。可能是我的问题不清楚。碰巧不能在事务方法内切换数据源..(@Transactional)。并且似乎处理器步骤(春季批处理中的读取器,处理器,写入器)遵循事务行为,因此一旦进程开始,数据源切换就不会在内部发生......我想知道是否有任何解决了这个问题?
  • 伙计们,这个问题有什么解决办法吗?我也遇到了麻烦,请指教。
猜你喜欢
  • 1970-01-01
  • 2019-02-14
  • 2019-12-07
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多