使用commons-dbcp连接池池,踩坑记录

commons-dbcp连接数据库,实际生产环境问题启动异常问题

问题: 实际项目的生产环境需要使用现场的另外一个数据库,进行数据的查询操作,在网上找到有几种spring的数据库连接方式,使用了dbcp进行数据库连接。

操作步骤
  1. 先添加依赖
		<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>
  1. 新建一个数据配置文件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
  1. 使用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的时候, 有可能有影响

  1. 将添加到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立起来!!!

### 回答1: IEEE 1588v2是一种用于实现精确时间同步的网络协议。该协议能够通过网络同步各个节点的时钟,并提供高精度的时间戳。要下载IEEE 1588v2协议,可以按照以下步骤进行。 首先,需要访问IEEE(电气和电子工程师协会)的官方网站。在该网站上,可以找到有关IEEE 1588v2协议的页面。从该页面上,可以获取到相关的标准文档和规范,这是下载IEEE 1588v2协议的重要资料。 其次,可以在IEEE的官方网站上查找有关IEEE 1588v2协议的技术文献和论文。这些文献和论文可以提供更为详细的信息,以及IEEE 1588v2协议的实现方法和应用场景。可以选择相关的论文进行下载,以便更好地理解和学习该协议。 此外,还可以通过在搜索引擎中输入"IEEE 1588v2协议下载"等关键词进行搜索。在搜索结果中,可以找到其他网站或平台提供的有关IEEE 1588v2协议的资源,如源代码、工具和应用案例等。根据需要,可以选择合适的资源进行下载和使用。 总之,下载IEEE 1588v2协议可以通过访问IEEE官方网站获取标准文档和规范,查找相关的技术文献和论文,以及在搜索引擎中搜索其他相关资源进行下载。这些资源将帮助了解和应用IEEE 1588v2协议,以实现精确的时间同步。 ### 回答2: IEEE 1588v2是一种用于精确时间同步的网络协议。它是由国际电气电子工程师学会(IEEE)制定的,该协议的全称是IEEE 1588v2 Precision Time Protocol(PTP),旨在提供网络设备之间的高精度时间同步。 要下载IEEE 1588v2协议,可以按照以下步骤进行操作: 1. 打开Web浏览器,进入IEEE官方网站(https://www.ieee.org/)。 2. 在网站的搜索框中输入"IEEE 1588v2"或"Precision Time Protocol",点击搜索按钮。 3. 在搜索结果中选择"IEEE 1588v2"或"IEEE 1588v2 Precision Time Protocol"的相关链接,通常是官方标准文档。 4. 根据网站提供的下载选项,选择合适的格式和版本进行下载。可以选择PDF、Word文档或其他常见文档格式。 5. 协议文件下载完成后,可以保存到本地计算机的指定位置。 当然,除了从IEEE官方网站下载,还可以通过其他途径获取IEEE 1588v2协议,比如在学术论文数据库或技术文档网站上进行搜索和下载。 下载IEEE 1588v2协议后,可以详细查阅其中的规范和技术细节,了解该协议的功能、实现原理以及如何在网络设备中进行使用和配置。它将对网络中需要高精度时间同步的应用和系统设计非常有帮助,如金融交易、电力系统、工业自动化等领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值