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

我想使用您的Application Server内置功能来管理 DataSource,并使用JNDI访问它。我正在使用带有Spring

JPA数据的Spring Boot

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

spring.datasource.jndi-name=jdbc/customers

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

<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"/>

一切正常。

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

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

 <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"/>

我尝试了以下选项,但均未成功:

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

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

根据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服务器正在启动。日志中没有错误打印。

我有以下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配置:

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

使用以下属性文件进行试用:

  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

它在客户模式中创建了所有表,但是也尝试从其他模式中查找其他表失败。

回答:

这是您的第三次试用的解决方案,需要进行一些修改。考虑以下解决方案(Spring Boot 1.3.2):

application.properties文件:

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存储库一起使用。

以上是 使用JNDI在Spring Boot中配置多个数据源 的全部内容, 来源链接: utcz.com/qa/433689.html

回到顶部