Spring 避免多模式数据库上的代码重复
我有一个遗留应用程序,它有一个数据库,可以将数据拆分为同一物理数据库上的多个模式。这些模式在结构上是相同的 我使用一个使用SpringBootDataJPA的微服务来处理单个模式。然后,为了避免代码重复,我创建了一个路由器服务,将请求转发到单个模式的microservice副本,每个副本具有不同的数据库连接。但我发现这有点过分(但有效) 我正试图把它缩减为一个单一的微服务。我还没有成功,但是我用Spring 避免多模式数据库上的代码重复,spring,jpa,spring-data,microservices,Spring,Jpa,Spring Data,Microservices,我有一个遗留应用程序,它有一个数据库,可以将数据拆分为同一物理数据库上的多个模式。这些模式在结构上是相同的 我使用一个使用SpringBootDataJPA的微服务来处理单个模式。然后,为了避免代码重复,我创建了一个路由器服务,将请求转发到单个模式的microservice副本,每个副本具有不同的数据库连接。但我发现这有点过分(但有效) 我正试图把它缩减为一个单一的微服务。我还没有成功,但是我用schema属性设置了表 @Table( name = "alerts", schem
schema
属性设置了表
@Table(
name = "alerts",
schema = "ca"
)
但是,当我尝试执行继承和@MappedSuperclass
以减少代码重复时,它会变得混乱
此外,@OneToMany
由于继承错误而分离,例如X引用未知实体:Y
基本上,有一种在JPA上使用继承的方法,它使用相同的表结构,不同的只是模式,没有复制和粘贴太多代码。理想情况下,我只想将一个“schema”参数传递给DAO,它会以某种方式为我执行此操作。最后,我们只需要一个根据情况进行路由的数据源。为此,将使用扩展
AbstractRoutingDataSource
的@组件
,并使用线程本地
存储请求上下文
ThreadLocal
应该是这样的(例如使用Lombok)
最后是路由器,它被标记为@Primary
数据源,以确保它是JPA使用的路由器
@Component
@Primary
public class RoutingDatasource extends AbstractRoutingDataSource {
@Autowired
@Qualifier("schema1")
private DataSource schema1;
@Autowired
@Qualifier("schema2")
private DataSource schema2;
@Override
public void afterPropertiesSet() {
setTargetDataSources(
Map.of(
"schema1", schema1,
"schema2", schema2
)
);
super.afterPropertiesSet();
}
@Override
protected Object determineCurrentLookupKey() {
return UserContext.getSchema();
}
}
当所有不同的都是模式甚至是数据源时,这避免了代码重复
@Configuration
public class DataSources {
@Bean
public DataSource schema1() {
return build("schema1");
}
@Bean
public DataSource schema2() {
return build("schema2");
}
private DataSource buildDataSource(String schema) {
...
return new DriverManagerDataSource(url, username, password);
}
}
@Component
@Primary
public class RoutingDatasource extends AbstractRoutingDataSource {
@Autowired
@Qualifier("schema1")
private DataSource schema1;
@Autowired
@Qualifier("schema2")
private DataSource schema2;
@Override
public void afterPropertiesSet() {
setTargetDataSources(
Map.of(
"schema1", schema1,
"schema2", schema2
)
);
super.afterPropertiesSet();
}
@Override
protected Object determineCurrentLookupKey() {
return UserContext.getSchema();
}
}