我遇到了以下问题,我正在寻找 Spring - MVC和Hibernate 中的解决方案。
问题陈述:有一个UI,它有一个文本区域和提交按钮。在文本区域中,用户可以编写SQL查询,提交后,必须在多个数据库中执行此SQL查询。
注意:假设已经配置了多个数据库。
请告诉我实施它的最佳方法。
答案 0 :(得分:1)
您可以考虑两个选项:
AbstractRoutingDataSource
使用此解决方案,您可以在执行查询之前切换到正确的数据库。所以你可以写点像
// GOLD database
CustomerContextHolder.setCustomerType(CustomerType.GOLD);
List<Item> goldItems = catalog.getItems();
assertEquals(3, goldItems.size());
System.out.println("gold items: " + goldItems);
// SILVER database
CustomerContextHolder.setCustomerType(CustomerType.SILVER);
List<Item> silverItems = catalog.getItems();
assertEquals(2, silverItems.size());
System.out.println("silver items: " + silverItems);
// DEFAULT database
CustomerContextHolder.clearCustomerType();
List<Item> bronzeItems = catalog.getItems();
assertEquals(1, bronzeItems.size());
System.out.println("bronze items: " + bronzeItems);
以下是一些文档:
https://spring.io/blog/2007/01/23/dynamic-datasource-routing/
http://fedulov.website/2015/10/14/dynamic-datasource-routing-with-spring/
这涉及您事先知道特定服务所需的事务管理器。
答案 1 :(得分:1)
我假设您在应用程序上下文(?)中连接了多个数据源。如果是这样,并假设它们具有不同的限定符,则可以将它们注入另一个组件,通常是从控制器调用或直接调用到控制器中的服务。
@Autowired
List<DataSource> datasources;
应该通过构造函数注入来完成技巧。使用后者,您可以为每个DataSource创建一个JdbcTemplate。然后循环遍历列表并对所有数据源执行相同的sql查询。