Spring 引导 jpa 通过实体管理器访问辅助数据源
Spring boot jpa accessing secondary datasource via entity manager
我有 2 个数据源。主数据库写得很好,所以我将它与 JPA 一起用于多个查询。相反,辅助数据源使用一个非常丑陋的数据库,但我只需要做一个大查询(没有其他操作)。
在此之后 我能够设置辅助数据源(在 weblogic 上),所以现在我的目标是在辅助数据源上调用本机查询。
这是我的代码:
application.properties
spring.datasource.jiano.jndi-name=jdbc/JianoDS
spring.datasource.jiano.driver-class-oracle.jdbc.driver.OracleDriver
spring.datasource.jiano.hikari.connection-timeout=60000
spring.datasource.jiano.hikari.maximum-pool-size=5
spring.datasource.sgu.jndi-name=jdbc/sguDatasource
spring.datasource.sgu.driver-class-oracle.jdbc.driver.OracleDriver
spring.datasource.sgu.hikari.connection-timeout=60000
spring.datasource.sgu.hikari.maximum-pool-size=5
Spring 引导主程序:
@ComponentScan
@SpringBootApplication
public class BemonitorcaaApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
public static void main(String[] args) {
SpringApplication.run(BemonitorcaaApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(BemonitorcaaApplication.class);
}
}
我在下面添加了 class 用于处理多个 :
@Configuration
public class DatasourceConfig {
@Value("${spring.datasource.jiano.jndi-name}")
private String primaryJndiName;
@Value("${spring.datasource.sgu.jndi-name}")
private String secondaryJndiName;
private JndiDataSourceLookup lookup = new JndiDataSourceLookup();
@Primary
@Bean(destroyMethod = "") // destroy method is disabled for Weblogic update app ability
public DataSource primaryDs() {
return lookup.getDataSource(primaryJndiName);
}
@Bean(name = "sguDs", destroyMethod = "") // destroy method is disabled for Weblogic update app ability
public DataSource secondaryDs() {
return lookup.getDataSource(secondaryJndiName);
}
}
控制器:
@RestController
@RequestMapping("/test")
public class IapaController {
@Autowired
IapaService iapaService;
@PersistenceContext
EntityManager em;
@RequestMapping("/v1/the-only-query-on-2nd-datasource")
public List<String> test2ndDS() {
List<String> itemList = em.createQuery("Select a.text ......." )
.getResultList(); //Not working
return itemList ;
}
@RequestMapping("/v1/primary-ds-is-working-fine")
public List<IapaTipiAndamenti> test1stDS() {
return iapaService.test1stDS(); //This is working, here for example I will use a typical jpa findAll
}
//...other jpa methods for the primary datasource
}
实体管理器不起作用,我尝试在 DatasourceConfig
中添加实体管理器配置,但它不起作用。 (例如,我没有要扫描的包,因为我只在辅助数据源上执行本机查询,return 是原始类型,所以没有域或存储库 classes。)
如何修复实体管理器? (我正在使用 Spring boot 1.5.17.RELEASE)
您好,您可以将简单的 JdbcTemplate 对象与您的第二个数据源一起使用,例如
@Configuration
public class DatasourceConfig {
@Value("${spring.datasource.jiano.jndi-name}")
private String primaryJndiName;
@Value("${spring.datasource.sgu.jndi-name}")
private String secondaryJndiName;
private JndiDataSourceLookup lookup = new JndiDataSourceLookup();
@Primary
@Bean(destroyMethod = "") // destroy method is disabled for Weblogic update app ability
public DataSource primaryDs() {
return lookup.getDataSource(primaryJndiName);
}
@Bean(name = "sguDs", destroyMethod = "") // destroy method is disabled for Weblogic update app ability
public DataSource secondaryDs() {
return lookup.getDataSource(secondaryJndiName);
}
@Bean
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(secondaryDs());
}
}
然后在你的控制器中尝试:
@RestController
@RequestMapping("/test")
public class IapaController {
@Autowired
IapaService iapaService;
@Autowired
JdbcTemplate jdbcTemplate;
@RequestMapping("/v1/the-only-query-on-2nd-datasource")
public List<String> test2ndDS() {
String query = "Select * ....";
List<String> itemList = (List<String>) jdbcTemplate.queryForList(query, String.class);
return itemList ;
}
@RequestMapping("/v1/primary-ds-is-working-fine")
public List<IapaTipiAndamenti> test1stDS() {
return iapaService.test1stDS(); //This is working, here for example I will use a typical jpa findAll
}
//...other jpa methods for the primary datasource
}
我有 2 个数据源。主数据库写得很好,所以我将它与 JPA 一起用于多个查询。相反,辅助数据源使用一个非常丑陋的数据库,但我只需要做一个大查询(没有其他操作)。
在此之后
这是我的代码:
application.properties
spring.datasource.jiano.jndi-name=jdbc/JianoDS
spring.datasource.jiano.driver-class-oracle.jdbc.driver.OracleDriver
spring.datasource.jiano.hikari.connection-timeout=60000
spring.datasource.jiano.hikari.maximum-pool-size=5
spring.datasource.sgu.jndi-name=jdbc/sguDatasource
spring.datasource.sgu.driver-class-oracle.jdbc.driver.OracleDriver
spring.datasource.sgu.hikari.connection-timeout=60000
spring.datasource.sgu.hikari.maximum-pool-size=5
Spring 引导主程序:
@ComponentScan
@SpringBootApplication
public class BemonitorcaaApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
public static void main(String[] args) {
SpringApplication.run(BemonitorcaaApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(BemonitorcaaApplication.class);
}
}
我在下面添加了 class 用于处理多个
@Configuration
public class DatasourceConfig {
@Value("${spring.datasource.jiano.jndi-name}")
private String primaryJndiName;
@Value("${spring.datasource.sgu.jndi-name}")
private String secondaryJndiName;
private JndiDataSourceLookup lookup = new JndiDataSourceLookup();
@Primary
@Bean(destroyMethod = "") // destroy method is disabled for Weblogic update app ability
public DataSource primaryDs() {
return lookup.getDataSource(primaryJndiName);
}
@Bean(name = "sguDs", destroyMethod = "") // destroy method is disabled for Weblogic update app ability
public DataSource secondaryDs() {
return lookup.getDataSource(secondaryJndiName);
}
}
控制器:
@RestController
@RequestMapping("/test")
public class IapaController {
@Autowired
IapaService iapaService;
@PersistenceContext
EntityManager em;
@RequestMapping("/v1/the-only-query-on-2nd-datasource")
public List<String> test2ndDS() {
List<String> itemList = em.createQuery("Select a.text ......." )
.getResultList(); //Not working
return itemList ;
}
@RequestMapping("/v1/primary-ds-is-working-fine")
public List<IapaTipiAndamenti> test1stDS() {
return iapaService.test1stDS(); //This is working, here for example I will use a typical jpa findAll
}
//...other jpa methods for the primary datasource
}
实体管理器不起作用,我尝试在 DatasourceConfig
中添加实体管理器配置,但它不起作用。 (例如,我没有要扫描的包,因为我只在辅助数据源上执行本机查询,return 是原始类型,所以没有域或存储库 classes。)
如何修复实体管理器? (我正在使用 Spring boot 1.5.17.RELEASE)
您好,您可以将简单的 JdbcTemplate 对象与您的第二个数据源一起使用,例如
@Configuration
public class DatasourceConfig {
@Value("${spring.datasource.jiano.jndi-name}")
private String primaryJndiName;
@Value("${spring.datasource.sgu.jndi-name}")
private String secondaryJndiName;
private JndiDataSourceLookup lookup = new JndiDataSourceLookup();
@Primary
@Bean(destroyMethod = "") // destroy method is disabled for Weblogic update app ability
public DataSource primaryDs() {
return lookup.getDataSource(primaryJndiName);
}
@Bean(name = "sguDs", destroyMethod = "") // destroy method is disabled for Weblogic update app ability
public DataSource secondaryDs() {
return lookup.getDataSource(secondaryJndiName);
}
@Bean
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(secondaryDs());
}
}
然后在你的控制器中尝试:
@RestController
@RequestMapping("/test")
public class IapaController {
@Autowired
IapaService iapaService;
@Autowired
JdbcTemplate jdbcTemplate;
@RequestMapping("/v1/the-only-query-on-2nd-datasource")
public List<String> test2ndDS() {
String query = "Select * ....";
List<String> itemList = (List<String>) jdbcTemplate.queryForList(query, String.class);
return itemList ;
}
@RequestMapping("/v1/primary-ds-is-working-fine")
public List<IapaTipiAndamenti> test1stDS() {
return iapaService.test1stDS(); //This is working, here for example I will use a typical jpa findAll
}
//...other jpa methods for the primary datasource
}