Spring批处理中的抽象路由数据源

Spring批处理中的抽象路由数据源,spring,spring-batch,Spring,Spring Batch,我试图在spring批处理应用程序中实现AbstractRoutingDatasource。 我的数据源在调用方法之前在DAO层进行切换 但问题似乎在于SpringBatch中的所有批处理作业都是基于事务的。 因为它们是基于事务的,所以所有数据源在事务开始之前都被设置,并且不可能在事务的中间切换数据源。 我的假设正确吗??还有解决方案/解决方法吗 使用路由数据源需要一个映射,该映射提供您选择的键和作为数据源的值。您可以决定使用哪种类型的键,例如不同国家/地区的语言环境。然后在实现Abstract

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

但问题似乎在于SpringBatch中的所有批处理作业都是基于事务的。 因为它们是基于事务的,所以所有数据源在事务开始之前都被设置,并且不可能在事务的中间切换数据源。
我的假设正确吗??还有解决方案/解决方法吗

使用路由数据源需要一个映射,该映射提供您选择的键和作为数据源的值。您可以决定使用哪种类型的键,例如不同国家/地区的语言环境。然后在实现AbstractRoutingDataSource的类中,您提供了一个从数据源映射中检索的键

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

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

这在任何基于Spring的应用程序中都不起作用。您需要在事务启动之前设置路由参数。是的,您的假设是正确的。这在任何基于Spring的应用程序中都不起作用。你是说春季批次吗??但是批量作业呢??抽象路由数据源永远不能应用于spring批处理??也许这可以工作,但您必须使用XA跨越tx;我没有使用它们,我指的是任何基于Spring的通用应用程序(不仅仅是基于Spring批处理的)。当事务管理器启动事务时,从数据源请求JDBC连接。因此,路由只能在TX启动时发生。顺便说一句。查看这篇关于SpringBatch中事务处理的伟大文章(如果您还没有阅读过的话)-(不要忘记阅读第2部分和第3部分)。在sprgin批处理中有几个地方可以使用“TX magic”。我清楚地了解如何根据密钥切换数据源。可能是我的问题不清楚。在事务性方法(@transactional)中无法切换数据源。处理器步骤(spring批处理中的读写器、处理器、写入器)似乎遵循事务行为,因此一旦进程启动,数据源切换就不会在内部发生……我想知道是否有解决方案?伙计们,有解决方案吗?我也有麻烦,请指教。