当前位置: 首页 > 知识库问答 >
问题:

Spring boot jpa通过实体管理器访问辅助数据源

胡高朗
2023-03-14

我有两个数据源。主数据库编写得很好,所以我将它与JPA一起用于多个查询。相反,辅助数据源使用了一个非常难看的数据库,但我只需要执行一个大查询(而不需要其他操作)。通过这个链接,我可以设置辅助数据源(在weblogic上),所以现在我的目标是在辅助数据源上调用本机查询。

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    
@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);
    }
}   
@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
    }

共有1个答案

史昊焱
2023-03-14

Hello您可以将简单的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
    }
 类似资料:
  • 否则,我将需要把我的大查询放在一个注释中。我更希望有更清楚的东西,而不是一个长的文本。

  • 问题内容: 我正在使用Spring 3.1.1.RELEASE,JUnit 4.8.1和Hibernate 4.1.5.Final。我正在尝试测试二级缓存是否配置正确,但是不确定如何做。我正在使用像这样在Spring中配置的JPA实体管理器… 我已经像这样配置了二级缓存… 给定javax.persistence.EntityManager,如何访问org.hibernate.stat.Statis

  • 问题内容: 我是PHP和SQL领域的一名新开发人员。到目前为止,我只完成了Objective- C编程。但是,我的一个项目要求我拥有一个在线数据库,我需要从我的应用程序访问该数据库。我打算使用该框架来远程访问数据库,如下所示: 但这是行不通的,因为我联系了我的托管服务提供商,并且他们已经对其进行了设置,因此我无法从外部主机访问我的数据库(出于安全性考虑)。因此,我将不得不寻找替代方案。我唯一想到的

  • 我想通过使用Eclipse的OWL API访问我的本体和SWRL规则。有没有人能帮我做一个确切的程序来告诉我该怎么做? 我尝试了以下代码,但似乎没有得到任何响应。请记住,我的Java技能很差。 我需要一个确切的程序来解决这个问题。 我已经有的代码是:

  • 我正在为Spring Data JPA存储库编写一个自定义实现。所以我有: = 我的问题是:在的实现中,我需要访问注入SpringData的实体管理器。如何得到它?我可以使用自动连接,但问题是这个存储库必须在设置多个持久性单元的应用程序中工作。因此,要告诉Spring我需要哪一个,我必须使用。然而,由于我的存储库是在可重用服务层中定义的,因此我不知道高级应用程序层将配置注入我的存储库中的持久化单元

  • 我编写了以下applescript来打开一个文档,同时在我的文字处理器应用程序中隐藏了一些恼人的持久工具栏。当我直接从脚本编辑器播放时,效果非常好。但当我把它变成一个应用程序,并尝试在阿尔弗雷德(而不是阿尔弗雷德2)中玩时,我得到了以下信息: 哦,我尝试了比“POSIX”更普通的路线,但都带来了相同的结果。此外,我正在运行最新版本的埃尔卡皮坦。