如何在独立 (war) 和嵌入式 Tomcat 中为 Spring-Boot 应用程序配置数据源?
How to configure DataSource for a Spring-Boot Application in a Standalone (war) and in an embedded Tomcat?
我有一个 Spring-Boot-Aplication dependencyManagement
:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
和以下 dependencies
:
spring-boot-starter-jersey
spring-boot-starter-jdbc(exclusion:tomcat-jdbc)
HikariCP(version:3.3.1)
ojdbc7
在 Tomcat 我将 JNDI-Datasource 配置为:
<Resource name="jdbc/myDS"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
username="Superuser"
password="secret"
url="jdbc:oracle:thin:@xxxDbX"
../>
在 .properties
文件中,我添加了以下属性:
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.jndi-name=jdbc/myDS
由于 Spring-Boot
能够从属性配置 DataSource,我让它这样做并且我没有为 编写额外的代码数据源。
部署在 独立 Tomcat 中,它运行完美。
逻辑上Spring Boot 无法在 embedded [=71] 中找到 JNDI-Resource =] 并将应用程序启动为 Spring-Boot-Application 我得到:
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to bind properties under 'spring.datasource.type' to java.lang.Class<javax.sql.DataSource>:
Property: spring.datasource.type
Value: org.apache.tomcat.jdbc.pool.DataSource
Origin: class path resource [application.properties]:12:24
Reason: No converter found capable of converting from type [java.lang.String] to type [java.lang.Class<javax.sql.DataSource>]
Action:
Update your application's configuration
我希望能够将应用程序作为 Spring-Boot-Application 启动并构建 war -可以部署在任何 独立 Tomcat.
中的文件
如果应用程序作为 Spring-Boot-Application 启动,是否可以通过为第二个数据源添加 properties
或者我有义务要有第二个 .properties
文件吗?
对我有用的解决方案是添加一个 custom-properties 以用于 中的 DataSource嵌入式 Tomcat 服务器 像这样:
# for a dedicated Tomcat
spring.datasource.jndi-name=jdbc/dirserver
# for the embedded Tomcat
embedded.datasource.driver-class-name=oracle.jdbc.OracleDriver
embedded.datasource.url=jdbc:oracle:thin:@//myServer:1521/xxxxx
embedded.datasource.username=superuser
embedded.datasource.password=topsecret
并在 class 中定义 @Bean DataSource 注释 @SpringBootApplication:
@SpringBootApplication
public class MySbApplication extends SpringBootServletInitializer {
private static final Logger lg = LoggerFactory.getLogger(MySbApplication.class);
@Value("${embedded.datasource.username}")
String username;
@Value("${embedded.datasource.password}")
String password;
@Value("${embedded.datasource.driver-class-name}")
String driverClassName;
@Value("${embedded.datasource.url}")
String url;
@Bean(destroyMethod = "")
public DataSource oracledataSoutŕce() throws SQLException {
final OracleDataSource dataSource = new OracleDataSource();
dataSource.setUser(username);
dataSource.setPassword(password);
dataSource.setURL(url);
dataSource.setImplicitCachingEnabled(true);
dataSource.setFastConnectionFailoverEnabled(true);
return dataSource;
}
}
我将在 Github.
中的示例项目中添加一个 link
我有一个 Spring-Boot-Aplication dependencyManagement
:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
和以下 dependencies
:
spring-boot-starter-jersey
spring-boot-starter-jdbc(exclusion:tomcat-jdbc)
HikariCP(version:3.3.1)
ojdbc7
在 Tomcat 我将 JNDI-Datasource 配置为:
<Resource name="jdbc/myDS"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
username="Superuser"
password="secret"
url="jdbc:oracle:thin:@xxxDbX"
../>
在 .properties
文件中,我添加了以下属性:
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.jndi-name=jdbc/myDS
由于 Spring-Boot
能够从属性配置 DataSource,我让它这样做并且我没有为 编写额外的代码数据源。
部署在 独立 Tomcat 中,它运行完美。
逻辑上Spring Boot 无法在 embedded [=71] 中找到 JNDI-Resource =] 并将应用程序启动为 Spring-Boot-Application 我得到:
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to bind properties under 'spring.datasource.type' to java.lang.Class<javax.sql.DataSource>:
Property: spring.datasource.type
Value: org.apache.tomcat.jdbc.pool.DataSource
Origin: class path resource [application.properties]:12:24
Reason: No converter found capable of converting from type [java.lang.String] to type [java.lang.Class<javax.sql.DataSource>]
Action:
Update your application's configuration
我希望能够将应用程序作为 Spring-Boot-Application 启动并构建 war -可以部署在任何 独立 Tomcat.
中的文件如果应用程序作为 Spring-Boot-Application 启动,是否可以通过为第二个数据源添加 properties
或者我有义务要有第二个 .properties
文件吗?
对我有用的解决方案是添加一个 custom-properties 以用于 中的 DataSource嵌入式 Tomcat 服务器 像这样:
# for a dedicated Tomcat
spring.datasource.jndi-name=jdbc/dirserver
# for the embedded Tomcat
embedded.datasource.driver-class-name=oracle.jdbc.OracleDriver
embedded.datasource.url=jdbc:oracle:thin:@//myServer:1521/xxxxx
embedded.datasource.username=superuser
embedded.datasource.password=topsecret
并在 class 中定义 @Bean DataSource 注释 @SpringBootApplication:
@SpringBootApplication
public class MySbApplication extends SpringBootServletInitializer {
private static final Logger lg = LoggerFactory.getLogger(MySbApplication.class);
@Value("${embedded.datasource.username}")
String username;
@Value("${embedded.datasource.password}")
String password;
@Value("${embedded.datasource.driver-class-name}")
String driverClassName;
@Value("${embedded.datasource.url}")
String url;
@Bean(destroyMethod = "")
public DataSource oracledataSoutŕce() throws SQLException {
final OracleDataSource dataSource = new OracleDataSource();
dataSource.setUser(username);
dataSource.setPassword(password);
dataSource.setURL(url);
dataSource.setImplicitCachingEnabled(true);
dataSource.setFastConnectionFailoverEnabled(true);
return dataSource;
}
}
我将在 Github.
中的示例项目中添加一个 link