<small id='XbPvs'></small><noframes id='XbPvs'>

    <bdo id='XbPvs'></bdo><ul id='XbPvs'></ul>
<i id='XbPvs'><tr id='XbPvs'><dt id='XbPvs'><q id='XbPvs'><span id='XbPvs'><b id='XbPvs'><form id='XbPvs'><ins id='XbPvs'></ins><ul id='XbPvs'></ul><sub id='XbPvs'></sub></form><legend id='XbPvs'></legend><bdo id='XbPvs'><pre id='XbPvs'><center id='XbPvs'></center></pre></bdo></b><th id='XbPvs'></th></span></q></dt></tr></i><div id='XbPvs'><tfoot id='XbPvs'></tfoot><dl id='XbPvs'><fieldset id='XbPvs'></fieldset></dl></div>

        <legend id='XbPvs'><style id='XbPvs'><dir id='XbPvs'><q id='XbPvs'></q></dir></style></legend>
        <tfoot id='XbPvs'></tfoot>

      1. 在 Spring Boot 中使用 JNDI 配置多个数据源

        时间:2024-08-24

        1. <tfoot id='okf4v'></tfoot>
            <tbody id='okf4v'></tbody>

          <small id='okf4v'></small><noframes id='okf4v'>

          • <bdo id='okf4v'></bdo><ul id='okf4v'></ul>

              <i id='okf4v'><tr id='okf4v'><dt id='okf4v'><q id='okf4v'><span id='okf4v'><b id='okf4v'><form id='okf4v'><ins id='okf4v'></ins><ul id='okf4v'></ul><sub id='okf4v'></sub></form><legend id='okf4v'></legend><bdo id='okf4v'><pre id='okf4v'><center id='okf4v'></center></pre></bdo></b><th id='okf4v'></th></span></q></dt></tr></i><div id='okf4v'><tfoot id='okf4v'></tfoot><dl id='okf4v'><fieldset id='okf4v'></fieldset></dl></div>
            1. <legend id='okf4v'><style id='okf4v'><dir id='okf4v'><q id='okf4v'></q></dir></style></legend>

                  本文介绍了在 Spring Boot 中使用 JNDI 配置多个数据源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我想使用您的应用程序服务器内置功能管理 多个 数据源并使用 JNDI 访问它.我正在使用带有 Spring JPA 数据的 Spring Boot.

                  I want to manage multiple DataSource using your Application Servers built-in features and access it using JNDI. I am using Spring boot with Spring JPA data.

                  我能够为单个数据源配置 application.properties:

                  I am able to configure the application.properties for single datasource:

                  spring.datasource.jndi-name=jdbc/customers
                  

                  我在 context.xml 文件中的配置如下:

                  And my configuration in context.xml file as below:

                  <Resource name="jdbc/customer" auth="Container" type="javax.sql.DataSource"
                                 maxTotal="100" maxIdle="30" maxWaitMillis="10000"
                                 username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
                                 url="jdbc:mysql://localhost:3306/customer"/>
                  

                  一切正常.

                  但是当我无法配置两个数据源时.

                  But when I am unable to configure for two datasource.

                  我确定 context.xml 文件中的配置:

                  I am sure on the configuration in context.xml file:

                   <Resource name="jdbc/customer" auth="Container" type="javax.sql.DataSource"
                                     maxTotal="100" maxIdle="30" maxWaitMillis="10000"
                                     username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
                                     url="jdbc:mysql://localhost:3306/customer"/>
                  
                   <Resource name="jdbc/employee" auth="Container" type="javax.sql.DataSource"
                                     maxTotal="100" maxIdle="30" maxWaitMillis="10000"
                                     username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
                                     url="jdbc:mysql://localhost:3306/employee"/>
                  

                  我对 application.properties 文件的配置有疑问.

                  我尝试了以下选项但没有成功:

                  I tried the below options with no success:

                  spring.datasource.jndi-name=jdbc/customers,jdbc/employee
                  

                  请让我知道有关使用 JNDI 进行多数据源的 Spring boot 的任何详细信息.这几天我一直在寻找这个配置.

                  Please let me know any details on Spring boot with JNDI for multiple data source. I was looking for this configuration for days now.

                  第二次试用根据 Spring Boot 文档

                  spring.datasource.primary.jndi-name=jdbc/customer
                  spring.datasource.secondary.jndi-name=jdbc/project
                  

                  配置类.

                  @Bean
                  @Primary
                  @ConfigurationProperties(prefix="datasource.primary")
                  public DataSource primaryDataSource() {
                      return DataSourceBuilder.create().build();
                  }
                  
                  @Bean
                  @ConfigurationProperties(prefix="datasource.secondary")
                  public DataSource secondaryDataSource() {
                      return DataSourceBuilder.create().build();
                  }
                  

                  应用程序未启动.虽然tomcat服务器正在启动.日志中不会打印任何错误.

                  The application does not get started. Though the tomcat server is getting started. No errors are printed in the log.

                  第三次试用:使用 JndiObjectFactoryBean

                  我有以下 application.properties

                  I have the below application.properties

                  spring.datasource.primary.expected-type=javax.sql.DataSource
                  spring.datasource.primary.jndi-name=jdbc/customer
                  spring.datasource.primary.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
                  spring.datasource.primary.jpa.show-sql=false
                  spring.datasource.primary.jpa.hibernate.ddl-auto=validate
                  
                  spring.datasource.secondary.jndi-name=jdbc/employee
                  spring.datasource.secondary.expected-type=javax.sql.DataSource
                  spring.datasource.secondary.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
                  spring.datasource.secondary.jpa.show-sql=false
                  spring.datasource.secondary.jpa.hibernate.ddl-auto=validate
                  

                  以及下面的java配置:

                  And the below java configuration:

                  @Bean(destroyMethod="")
                  @Primary
                  @ConfigurationProperties(prefix="spring.datasource.primary")
                  public FactoryBean primaryDataSource() {
                      return new JndiObjectFactoryBean();
                  }
                  
                  @Bean(destroyMethod="")
                  @ConfigurationProperties(prefix="spring.datasource.secondary")
                  public FactoryBean secondaryDataSource() {
                      return new JndiObjectFactoryBean();
                  }
                  

                  但还是报错:

                  Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'primaryDataSource' defined in class path resource [com/web/initializer/MvcConfig.class]: Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name [jdbc/customer] is not bound in this Context. Unable to find [jdbc].
                  Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'secondaryDataSource' defined in class path resource [com/web/initializer/MvcConfig.class]: Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name [jdbc/employee] is not bound in this Context. Unable to find [jdbc].
                          at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)
                          at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474)
                          at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
                          at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
                          at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
                          at org.springframework.boot.context.web.SpringBootServletInitializer.run(SpringBootServletInitializer.java:117)
                          at org.springframework.boot.context.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:108)
                          at org.springframework.boot.context.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:68)
                          at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175)
                  

                  更新:使用以下属性文件试用:

                  Update: Trial using the below properties file:

                    spring.datasource.primary.expected-type=javax.sql.DataSource
                     spring.datasource.primary.jndi-name=java:comp/env/jdbc/customer
                  
                     spring.datasource.secondary.jndi-name=java:comp/env/jdbc/employee
                     spring.datasource.secondary.expected-type=javax.sql.DataSource
                  
                     spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
                     spring.jpa.show-sql=false
                     spring.jpa.hibernate.ddl-auto=validate
                  

                  它在客户模式中创建所有表,但尝试查找其他表也失败.(来自第二个模式)

                  It creates all the tables in customer schema, but fails trying to find the other tables also.(from the second schema)

                  推荐答案

                  这是您第三次试用的解决方案,稍作修改.考虑这个解决方案(Spring Boot 1.3.2):

                  This is the solution for your third trial a little bit modified. Consider this solution (Spring Boot 1.3.2):

                  application.properties 文件:

                  application.properties file:

                  spring.datasource.primary.jndi-name=java:/comp/env/jdbc/SecurityDS
                  spring.datasource.primary.driver-class-name=org.postgresql.Driver
                  
                  spring.datasource.secondary.jndi-name=java:/comp/env/jdbc/TmsDS
                  spring.datasource.secondary.driver-class-name=org.postgresql.Driver
                  
                  spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect
                  spring.jpa.show-sql=false
                  

                  配置:

                  @Configuration@ EnableConfigurationProperties
                  public class AppConfig {
                  
                      @Bean@ ConfigurationProperties(prefix = "spring.datasource.primary")
                      public JndiPropertyHolder primary() {
                          return new JndiPropertyHolder();
                      }
                  
                      @Bean@ Primary
                      public DataSource primaryDataSource() {
                          JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
                          DataSource dataSource = dataSourceLookup.getDataSource(primary().getJndiName());
                          return dataSource;
                      }
                  
                      @Bean@ ConfigurationProperties(prefix = "spring.datasource.secondary")
                      public JndiPropertyHolder secondary() {
                          return new JndiPropertyHolder();
                      }
                  
                      @Bean
                      public DataSource secondaryDataSource() {
                          JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
                          DataSource dataSource = dataSourceLookup.getDataSource(secondary().getJndiName());
                          return dataSource;
                      }
                  
                      private static class JndiPropertyHolder {
                          private String jndiName;
                  
                          public String getJndiName() {
                              return jndiName;
                          }
                  
                          public void setJndiName(String jndiName) {
                              this.jndiName = jndiName;
                          }
                      }
                  }
                  

                  然后您可以按照指南 http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html 将您的数据源与 jpa 存储库一起使用.

                  And then you can follow guide http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html to use your datasources with jpa repositories.

                  这篇关于在 Spring Boot 中使用 JNDI 配置多个数据源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:Spring Data JPA findBy/findAllBy 的区别 下一篇:在 Spring Data Rest 响应中选择性地扩展关联

                  相关文章

                  1. <tfoot id='TxRbm'></tfoot>
                    1. <small id='TxRbm'></small><noframes id='TxRbm'>

                        <bdo id='TxRbm'></bdo><ul id='TxRbm'></ul>

                      <legend id='TxRbm'><style id='TxRbm'><dir id='TxRbm'><q id='TxRbm'></q></dir></style></legend>
                    2. <i id='TxRbm'><tr id='TxRbm'><dt id='TxRbm'><q id='TxRbm'><span id='TxRbm'><b id='TxRbm'><form id='TxRbm'><ins id='TxRbm'></ins><ul id='TxRbm'></ul><sub id='TxRbm'></sub></form><legend id='TxRbm'></legend><bdo id='TxRbm'><pre id='TxRbm'><center id='TxRbm'></center></pre></bdo></b><th id='TxRbm'></th></span></q></dt></tr></i><div id='TxRbm'><tfoot id='TxRbm'></tfoot><dl id='TxRbm'><fieldset id='TxRbm'></fieldset></dl></div>