【发布时间】:2017-01-10 03:07:18
【问题描述】:
之前有人问过类似的问题,我已经解决了所有这些问题,但无法解决问题。相关问题 - Q1,Q2,Q3,Q4,Q5,Q6
我有一个带有 Spring Boot 的 Spring Batch 项目并尝试使用数据库连接池。我正在使用版本 8.5.x 的嵌入式 tomcat 容器。
如果我使用 application.properties 指定数据源和池设置,一切正常。
但是当我尝试使用 JNDI 时,我得到了异常 -
Caused by: java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory
我在 Maven jar 中没有看到任何 jar 名称 tomcat-dbcp-**,所以我不确定是否需要包含任何新的依赖项或需要设置默认数据源工厂以及如何进行。
下面是我设置的 JNDI bean,Question。我已经取消了某些值。
@Bean
public TomcatEmbeddedServletContainerFactory embeddedServletContainerFactory(){
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
tomcat.enableNaming();
return super.getTomcatEmbeddedServletContainer(tomcat);
}
@Override
protected void postProcessContext(Context context) {
ContextResource resource = new ContextResource();
resource.setName("jdbc/myDataSource");
resource.setType(DataSource.class.getName());
resource.setProperty("driverClassName", "com.ibm.db2.jcc.DB2Driver");
resource.setProperty("url", "url");
resource.setProperty("username", "user");
resource.setProperty("password", "*****");
context.getNamingResources().addResource(resource);
}
};
}
@Lazy
@Bean(destroyMethod="")
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
bean.setJndiName("java:comp/env/jdbc/myDataSource");
bean.setProxyInterface(DataSource.class);
bean.setLookupOnStartup(false);
bean.afterPropertiesSet();
return (DataSource)bean.getObject();
}
我的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<groupId>***</groupId>
<artifactId>***</artifactId>
<version>1.0.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>db2</groupId>
<artifactId>db2jcc</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>db2</groupId>
<artifactId>db2jcc_license_cu</artifactId>
<version>4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.0.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
【问题讨论】:
-
我不确定原因,是上级要求我这样做的。可能他们不希望属性文件中包含用户名和密码。我觉得奇怪的是spring boot不包括tomcat-dbcp依赖项作为starter POM的一部分,而是使用DBCP DataSource工厂作为默认工厂。
-
如果我们也必须保持开放以部署到非嵌入式环境,是否有更好的方法来保护数据库连接信息?我们通过类文件面临的一个挑战是为各种暂存环境编辑数据库 URL 和用户,但使用 war 文件分发数据库信息似乎不是一个好主意。
-
您不必将其包含在文件中。您可以在启动应用程序时将其作为参数传递或作为环境变量传递。此外,如果您指定数据源 jndi 名称,它将被使用而不是本地配置的实例。我建议阅读 Spring Boot 如何加载/解析属性文件以及如何为环境指定属性,而不是侵入它。简而言之,您应该使用框架而不是围绕框架。
标签: tomcat spring-boot spring-data spring-batch