commons-dbcp连接数据库,实际生产环境问题启动异常问题
问题: 实际项目的生产环境需要使用现场的另外一个数据库,进行数据的查询操作,在网上找到有几种spring的数据库连接方式,使用了dbcp进行数据库连接。
操作步骤
- 先添加依赖
<properties>
<commons-dbcp.version>1.4</commons-dbcp.version>
</properties>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
</dependency>
- 新建一个数据配置文件zhuzhouDb.properties,为了以后的数据库的修改方便,易扩展
# 数据库路径,连接的哪个数据库
jdbc.jdbcUrl=jdbc:oracle:thin:@192.168.44.90:1521:orcl
# 数据库驱动,使用哪个类进行数据库连接
jdbc.driverClass=oracle.jdbc.driver.OracleDriver
# 用户名和密码
jdbc.user=eagle
jdbc.password=123456
- 使用spring的 JdbcTemplate进行查询数据的操作,在spring的bean的配置文件中进行数据源的注入,spring-rbspQuery.xml。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<context:component-scan base-package="com.dragonsoft.eagle.rbspquery" />
<bean id="rbspQueryExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="100"/>
<property name="maxPoolSize" value="300"/>
<property name="queueCapacity" value="5000"/>
<property name="threadNamePrefix" value="RbspQuery-Client-Executor" />
</bean>
<!--株洲异地查询,适配第三方刑侦接口,查询结果翻译的数据库配置-->
<!-- 指定spring读取指定目录的properties配置文件 -->
<context:property-placeholder location="classpath:zhuzhouDb.properties"/>
<!-- 将连接池放入spring容器 -->
<bean name="zzDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 将JDBCTemplate放入spring容器 -->
<bean name="zzJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="zzDataSource"/>
</bean>
</beans>
有时间好好看下spring的jdbc这一模块 spring-framework官网
注意:这里我项目上已经有了一个名字为dataSource的bean,但是我之前写的时候另一个数据源的时候也命名成了 dataSource, 也导致启动不了,默认bean都是单例,有相同bean的name的时候, 有可能有影响
- 将添加到spring context容器中的jdbcTemplate根据名称注入到类中 。在项目启动的时候就将数据加载到内存中,在service类中@Service,这个类实现spring的 InitializingBean 方法,并将
@Service
public class ZhuZhouRbspQueryIndexService implements InitializingBean {
@Autowired
@Qualifier("zzJdbcTemplate")
private JdbcTemplate jdbcTemplate;
private Map<String, String> codes;
@Override
public void afterPropertiesSet() throws Exception {
logger.info("开始加载株洲编码码表...");
String sqlStr = "SELECT BZDMZ , BZDMMC FROM BM_CODE_MAP";
codes = Maps.newHashMap();
DataSource dataSource = jdbcTemplate.getDataSource();
logger.info("数据库信息:{}", dataSource.getConnection().toString());
jdbcTemplate.query(sqlStr, new RowCallbackHandler(){
public void processRow(ResultSet rs) throws SQLException {
String code = rs.getString("BZDMZ");
String name = rs.getString("BZDMMC");
if(StringUtils.isNotBlank(name)){
codes.put(code, name);
}
}
});
logger.info("共初始化株洲非空代码" + codes.size() + "个编码码表信息.");
}
}
- 至此步骤都已完成,本地项目启动,使用了本地的数据库进行连接,启动没有问题
- 然后发包到生产环境上的时候,启动就报错,一开始是报这个错误:
nested exception is java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource
这个是因为没有将 commons-dbcp-1.4.jar 包没有给现场,现场没有这些pom文件,依赖什么的,只有jar包和class文件。再重新启动,又报错,错误如下:
Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
这个上网查询之后是因为少了jar包,重点来了
在开发环境添加maven依赖之后,使用这个jar包(commons-dbcp)后,如果他依赖其他的jar包或者依赖的时候,会到本地仓库中将所需要的依赖导入到本地项目的lib目录中,这些不注意的话,自己不知道是不是加了其他jar包,知道maven change,然后import了,没有关心有哪些加进来了。
随后将依赖的commons-pool-1.5.4.jar包给现场后,启动就正常了,然后做的其他的需求也没问题。上网查了下,这commons-dbcp.jar会依赖好几个jar包commons-collections.jar(这个现场已经有了),oracle的连接jar包也有、commons-pool-1.5.4.jar(这个现场没有)、commons-collections.jar(这个现场也已经有了)
这个弄了快一天才弄好,因为公司没有现场环境,然后要现场人员配合就很费时费力,很麻烦。特此记录这个坑,希望以后不要踩了
加油学习,2020flag立起来!!!