使用dbcp做为数据库连接池

数据库连接池之DBCP 数据库连接池之DBCP前言在之前的文章中,我们学习了如何使用原生的JDBC连接操作数据库,如果对使用原生JDBC操作数据库比较熟的读者,可能会注意到这样一个问题,就是每次需要使用的时候,都需要获取一个Connection,然后通过Connection来获得相应的PreparedStatement,进而操作数据库。当每次创建一个Connection的时候,所需要消耗的资源是比较大的,但是如果使用单例的 阅读详情

这个会用到的,今天弄了半天没弄好commons dbcp的配置

api:http://egee-jra1-integration.web.cern.ch/egee-jra1-integration/repository/commons-dbcp/1.1/share/docs/apidocs/index.html   
jar包&源码:http://www.jdocs.com/dbcp/1.2.1/org/apache/commons/dbcp/BasicDataSource.html 
对于DBCP连接池的使用:

1.要在tomcat下的conf包中的server.xml中加入数据库连接池配置信息:

a.在<Host>标签下加入

 <Context path="/myweb" docBase="D:"apache-tomcat-6.0.18"webapps"myweb" > 

 <Resource auth="Container" name="jdbc/jlndb" type="javax.sql.DataSource"

    factory="org.apache.commons.dbcp.BasicDataSourceFactory" 

    driverClassName="oracle.jdbc.OracleDriver"     

    url="jdbc:oracle:thin:@localhost:1521:JLNDB" 

    username="db" 

    password="db" 

    maxActive="10000" 

    maxIdle="10000" 

    maxWait="10000"  

    removeAbandoned="true" 

    removeAbandonedTimeOut="10" 

    logAbandoned="true"/>

   </Context>

注释:

path指定访问Web应用的URL入口,注意/myweb,而不是myweb,必须有/。

docBase:表示的项目的具体路径。

< Resource >元素为JNDI,在lookup是要查找的资源,

name:表示JNDI在lookup是输入的资源名。

auth:是连接池管理权属性,Container表示容器管理。

name:表示你的连接池的名称也就是你要访问连接池的地址。

type:是对象的类型。

driverClassName:是数据库驱动的名称。

url:是数据库的地址。

username:是登陆数据库的用户名。

password:是登陆数据库的密码。

MaxActive:连接池的最大数据库连接数。设为0表示无限制。

maxIdle:最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。

maxWait :最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。

removeAbandoned:是否自我中断,默认是 false 。

removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值。

logAbandoned:是否记录中断事件, 默认为 false。

注意:

其中factory="org.apache.commons.dbcp.BasicDataSourceFactory" 也可以配置

factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" 

*maxActive:最大连接数据库连接数,设 0 为没有限制

*maxIdle:最大等待连接中的数量,设 0 为没有限制

*maxWait:最大等待毫秒数, 单位为 ms, 超过时间会出错误信息

b.在web.xml中加入配置信息:

数据库资源映射信息

 <resource-ref id="db">

    <description>DB Connection</description>

    <res-ref-name>jdbc/jlndb</res-ref-name>

    <res-type>javax.sql.DataSource</res-type>

    <res-auth>Container</res-auth>

 </resource-ref>

其中id可以不写。

注意:这里我没有配置web.xml也成功了。

c.添加架包,使用dbcp需要3个包:
common-dbcp.jar,
common-pool.jar,
common-collections.jar

数据库的驱动包:具体看数据库而定

2.需要一个servlet来初始化监视器

package  com.handson.bbs.servlet;

import  java.sql.SQLException;

import  javax.naming.Context;
import  javax.naming.InitialContext;
import  javax.naming.NamingException;
import  javax.servlet.ServletContextEvent;
import  javax.servlet.ServletContextListener;

import  org.apache.commons.dbcp.BasicDataSource;

import  com.handson.commons.jdbc.DataSourceProvider;
/**
 * **********************************************
 * @description 通过监视器,在项目启动时初始化连接池
 * 
@author Gavin.lee
 * @date Jun 27, 2009    1:13:28 PM
 * 
@version 1.0
 ***********************************************
 
*/

public   class  DBCPInitListener  implements  ServletContextListener  {
    
    
//释放连接池的资源
    public void contextDestroyed(ServletContextEvent event) {
        BasicDataSource ds 
= (BasicDataSource)DataSourceProvider.getInstance().getDataSource();
        
if(ds != null) {
            
try {
                ds.close();
            }
 catch (SQLException e) {
                e.printStackTrace();
            }

        }

    }


    
//初始化连接池
    public void contextInitialized(ServletContextEvent event) {
        
try {
            Context cxt 
= new InitialContext();
            BasicDataSource ds 
= (BasicDataSource)cxt.lookup("java:/comp/env/jdbc/dataSource");
            DataSourceProvider.getInstance().initDataSource(ds);
        }
 catch (NamingException e) {
            e.printStackTrace();
        }

    }


}

3.web.xml配置
     监视器
   < listener >
      
< listener - class > com.handson.bbs.servlet.DBCPInitListener </ listener - class >
  
</ listener >

4.DataSourceProvider用来初始化BasicDataSource
package  com.handson.commons.jdbc;

import  javax.sql.DataSource;
/**
 * **********************************************
 * @description 单态类初始化数据源
 * 
@author Gavin.lee
 * @date Jun 27, 2009    1:19:21 PM
 * 
@version 1.0
 ***********************************************
 
*/

public   class  DataSourceProvider  {
    
    
private DataSource ds;
    
    
private static DataSourceProvider instance;
    
    
private DataSourceProvider() {
    }

    
    
public static DataSourceProvider getInstance() {
        
if(instance == null) {
            instance 
= new DataSourceProvider();
        }

        
        
return instance;
    }

    
    
public void initDataSource(DataSource ds) {
        
this.ds = ds;
    }


    
public DataSource getDataSource() {
        
return ds;
    }

}


5.DAO层可以使用DBCP连接池资源了,这里为了扩展,封装了一个DBUtil类(不喜欢的话可以直接在DAO通过连接DataSourceProvider初始化资源)
package  com.handson.commons.jdbc;

import  java.io. * ;
import  java.sql. * ;

import  javax.sql. * ;
/**
 * **********************************************
 * @description DBUtil类,为扩展用
 * 
@author Gavin.lee
 * @date Jun 27, 2009    1:23:57 PM
 * 
@version 1.0
 ***********************************************
 
*/

public   class  DBUtil  {
    
private Connection conn = null;
    
private PreparedStatement prepStmt = null;
    
    
    
public DBUtil(String sql) throws SQLException  {
        DataSourceProvider provider 
= DataSourceProvider.getInstance();
        
this.conn = provider.getDataSource().getConnection();
        prepStmt 
= conn.prepareStatement(sql,
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);
    }

    
public DBUtil(Connection conn, String sql) throws SQLException  {
        
this.conn = conn;
        prepStmt 
= conn.prepareStatement(sql,
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);
    }

    
    
public DBUtil(DataSource ds, String sql) throws SQLException  {
        conn 
= ds.getConnection();
        prepStmt 
= conn.prepareStatement(sql,
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);
    }

    
    
public Connection getConnection() {
        
return conn;
    }

    
    
public PreparedStatement getPreparedStatement() {
        
return prepStmt;
    }

        
    
public boolean execute() throws SQLException {
        
if(prepStmt == null)
            
return false;
        
return prepStmt.execute();
    }

    
    
public ResultSet executeQuery() throws SQLException {        
        
return prepStmt.executeQuery();
    }

    
    
public int executeUpdate() throws SQLException {
        
if(prepStmt == null){
            
return -1;
        }

        
return prepStmt.executeUpdate();
    }

    
    
public void close() {
        
try {
            
if (prepStmt != null) {
                prepStmt.close();
                prepStmt 
= null;
            }

            
if(conn != null) {
                conn.close();
                conn 
= null;
            }

        }
 catch (Exception e) {
            e.printStackTrace();
        }

    }

    
    
public void setString(int index,String value) throws SQLException {
        prepStmt.setString(index,value);
    }

    
    
public void setInt(int index,int value) throws SQLException {
        prepStmt.setInt(index,value);
    }

    
    
public void setBoolean(int index,boolean value) throws SQLException {
        prepStmt.setBoolean(index,value);
    }

    
    
public void setDate(int index,Date value) throws SQLException {
        prepStmt.setDate(index,value);
    }

    
    
public void setDate(int index, java.util.Date value) throws SQLException {
        java.sql.Date date 
= new java.sql.Date(value.getTime());
        prepStmt.setDate(index, date);
    }

    
    
public void setTime(int index,Time value) throws SQLException {
        prepStmt.setTime(index,value);
    }

    
    
public void setTimestamp(int index,Timestamp value) throws SQLException {
        prepStmt.setTimestamp(index,value);
    }

    
    
public void setLong(int index,long value) throws SQLException {
        prepStmt.setLong(index,value);
    }

    
    
public void setFloat(int index,float value) throws SQLException {
        prepStmt.setFloat(index,value);
    }

    
    
public void setObject(int index, Object obj) throws SQLException {
        prepStmt.setObject(index, obj);
    }

    
    
/**
     * File file = new File("test/data.txt");
     * int fileLength = file.length();
     * InputStream fin = new java.io.FileInputStream(file);
     * mysql.setBinaryStream(5,fin,fileLength);
     
*/

    
public void setBinaryStream(int index,InputStream in,int length) throws SQLException {
        prepStmt.setBinaryStream(index,in,length);
    }

    
    
public void commit() {
        
try {
            conn.commit();
        }
 catch(Exception e) {
            e.printStackTrace();
        }

    }

    
    
public void rollback() {
        
try {
            conn.rollback();
        }
 catch(Exception e) {
            e.printStackTrace();
        }

    }

    
    
public static void main(String[] args) {
    }



    
}

6.具体的一个使用实例
private  DataSource ds;
    
    
public  ForumDAO() {
        
this.ds = DataSourceProvider.getInstance().getDataSource();
    }

    
/*
     * 通过帖子的主题来查找帖子
     * (non-Javadoc)
     * @see com.handson.bbs.dao.IForumDAO#searchForumsBySubject(java.lang.String)
     
*/

    
public  List < Forum >  searchForumsBySubject(String subject)  {
        
        String sql 
= "select * from forum where subject like '%" + subject + "%'";
        DBUtil db 
= null;
        List
<Forum> forums = null;
        
try{
            db 
= new DBUtil(ds,sql); 
            
//db.setString(1,subject);
            ResultSet rs = db.executeQuery();            
            Forum forum 
= null;
            
while(rs.next()){
                forums 
= new ArrayList<Forum>();
                forum 
= this.populate(rs);
                
                forums.add(forum);                
            }

            
        }
catch(Exception e){
            e.printStackTrace();
        }
finally{
            db.close();
        }

        
        
return forums;
    }

深入了解和应用DBCP数据库连接池 本文还有配套的精品资源,点击获取 简介:DBCP(Database Connection Pool)是一个开源的数据库连接池组件,通过复用数据库连接来提高Java应用性能和效率。它提供了稳定且高效的数据库连接管理服务。介绍了DBCP的工作原理,包括连接创建、分配、回收、管理以及配置参数设置。同时,说明了DBCP的使用步骤,并指出在现代Java应用中,DBCP被HikariC... 阅读详情

相关推荐

commons-dbcp2-2.0.1.jar

DBCP数据库连接池所需的jar包,JDK1.6+

DBCP连接池简易实现(Oracle)

闲来无事,就看了看连接池,在这里主要讲一下DBCP连接池中的properties配置文件和简单的实现(Oracle数据库) 准备工作:(本人小白还不知怎么上传文件)先说一下文件名吧: 主要三个jar包: commons-dbcp2-2.6.0.jar、commons-pool2-2.4.2.jar、commons-logging-1.1.1.jar 之后是properties配置文件 driver...

qq_44373419的博客 760

DBCP连接池的最简单应用(用于ORACLE数据库)

NULL 博文链接:https://iihero.iteye.com/blog/1266470

oracle的dbcp工具类,DBCP数据源的使用

使用用开源DBCP数据源的方法如下:1. 创建Java项目,添加jar包。(可以自己到网上下载) 2. 创建dbcp.properties配置文件,配置文件内容如下:username=rootpassword=rooturl=jdbc:mysql://192.168.1.100:3306/testdriverClassName=com.mysql.jdbc.DriverinitialSize=5m...

weixin_33464176的博客 278

避坑指南:Livox Mid-360双雷达SLAM配置中,那些官方文档没说的细节(IP设置、话题分离与时间同步)

本文详细解析了Livox Mid-360双雷达SLAM配置中的关键优化点,包括IP设置、话题分离与时间同步等官方文档未提及的细节。通过实战案例和代码示例,帮助开发者解决点云错位、IMU数据混乱等问题,提升SLAM系统的稳定性和精度。特别针对网络架构设计、驱动修改和时间同步机制提供了专业指导。

weixin_29745609的博客 426

AIGC大模型应用教学平台

该平台采用最新的AI推理加速芯片,提供30Tops算力和32GB存储,能够运行常见的大语言模型如ChatGLM2、Llama2、Baicuan、Mistral等,也可以运行文生图扩散模型Stable Diffusion,提供大模型微调、量化、转换和加速推理服务。在此基础上,平台还提供常见的生成式AI应用,包括AIGC知识抽取增强(RAG)、AIGC绘画、AIGC会话聊天、数字虚拟人等应用,以便学生能够掌握最新的生成式AI模型微调、提示工程和智能体应用技能。

中智讯的博客 1207

dbcp2 mybatis oracle jdbc driver 11.2.0.1

在tomcat的catalina.bat中加入配置。

hanjiangxuehua的博客 418

基于树莓派5的AR头显开发:从硬件选型到Unity整合全解析

增强现实(AR)技术通过将虚拟信息叠加到真实世界,为用户提供沉浸式交互体验。其核心原理依赖于计算机视觉进行环境感知与空间定位,并结合实时3D渲染实现虚实融合。在工程实践中,嵌入式平台因其低成本、低功耗特性,成为探索AR应用边界的重要载体。本项目以树莓派5为核心,通过集成OpenCV进行ArUco标记识别实现精准空间定位,并利用MediaPipe完成手势交互,最终在Unity引擎中完成虚实场景的实时渲染与融合,为开发者提供了一个完整的、可亲手实践的AR系统开发方案。

weixin_32430941的博客 254

Spring Boot JDBC + Oracle数据库+ Commons DBCP2示例

在本文中,我们将向您展示如何创建Spring Boot JDBC应用程序+ Oracle数据库+ Commons DBCP2连接池。 本文使用的工具: Spring Boot 1.5.1。发布 Oracle Database 11g速成版 Oracle JDBC驱动程序ojdbc7.jar 公用DBCP2 2.1.1 马文 Java 8 注意 相关– Spr...

一名可爱的技术搬运工 974

NVIDIA Jetson之交叉编译工具

参考:http://bbs.xfyun.cn/forum.php?mod=viewthread&amp;tid=33630 用TX2做红外热成像仪的识别,厂家不提供源码,只能提供对应版本的SDK,但是需要我们自己提供交叉编译器 由于之前没有做过交叉编译相关工作,对编译工具不太了解,因此查找相关资料学习下 交叉编译知识 一般来说,针对嵌入式平台的开发有两种编译模式:原生编译和交叉编译。原生编...

ZONGXP的博客 8384

YOLOv10改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型

本文记录的是基于MobileNet V3的YOLOv10目标检测轻量化改进方法研究。的模型结构是通过得来的,其中的基础模块结合了的深度可分离卷积、的线性瓶颈和倒置残差结构以及MnasNet中基于挤压和激励的轻量级注意力模块,使模型在性能、效率和灵活性方面都具有显著的优势。本文在替换骨干网络中配置了原论文中的small和large2种模型,以满足不同的需求。

Limiiiing的博客 514

ibatis中使用dbcp做为数据库连接池

ibatis中使用dbcp做为数据库连接池

kindy的开发工作室 1788

基于学术研究风云卫星数据下载教程

目录 一、相关网址 1.登录注册网址:国家卫星气象中心 2.风云数据服务客户端下载网址 3.风云卫星遥感数据服务网址 二、下载数据步骤 1.首先在注册登录网址,注册一个账户 2.待账户审核后,登录账户即可搜索并下载数据 三、相关工具下载 1.登录风云卫星遥感数据服务网址 2.NCSA HDFView软件 3.风云卫星数据(L1)处理软件包(FENGYUN Toolkit v1.1) 4.静止卫星云图分区图显示软件(SECView) 5.风云二号静止气象卫星数据及产品处理..

珞瑜的博客 1万+

java_JDBC连接池HikariCP和DBCP的使用

连接池是一种常用的技术,为什么需要连接池呢?这个需要从TCP说起。假如我们的服务器跟数据库没有部署在同一台机器,那么,服务器每次查询数据库都要先建立连接,一般都是TCP链接,建立连接就需要3次握手了,假设后台服务跟数据库的单程的访问时间需要10ms,那么光是建立连接就花了30ms,并且TCP还有慢启动的机制,实际上一次查询可能还不止1次TCP来回,查询效率就会大大降低。

2301_78311954的博客 2893

零倾覆力矩点(ZMP)

从形式上讲,ZMP 指的是空间中相对于一个平面(通常是地平面)抵消接触力矩的点的集合。这个集合实际上是一个轴,而不是一个点,但为了方便起见,让我们按照传统的推导方法来计算地面平面上的 ZMP。这一推导从任何多刚体系统的牛顿-欧拉运动方程开始:其中,为机器人的总质量,为重力矢量,为系统的重心,为加速度,为固定点的角动量变化率。在右侧,表示净接触扭矩,即施加到机器人上的所有接触扭矩之和,坐标取自质心 (COM)。

机器人控制与仿真应用 2371

基于Simulink的无迹卡尔曼滤波(UKF)SOC高精度估计仿真

本文介绍了基于Simulink的无迹卡尔曼滤波(UKF)在电池SOC高精度估计中的应用。通过无迹变换替代传统EKF的线性化过程,UKF显著提升了SOC估计精度,在强非线性工况下误差可控制在0.5%以内。文章详细阐述了UKF的核心原理,包括Sigma点生成、状态预测和观测更新等关键步骤,并基于Thevenin等效电路模型构建了完整的UKF SOC估算系统。通过Simulink建模和仿真验证,展示了UKF在大电流脉冲、变温工况等复杂场景下的优异性能,其动态响应时间小于30ms,长期累积误差低于0.7%。研究为储

amy_mhd的博客 124

DBCP连接池与C3P0连接池

DBCP连接池与C3P0连接池的比较 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源,如果创建一个池,用池来管理Connection,这样就可以重复使用Connection。有了池我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会

没有所谓的命运,只有不同的选择! 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据库连接池:DBCP、C3P0、Druid

数据库连接池数据库连接池一、JDBC连接数据库的缺陷在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,Java程序则要把代表连接的对象等加载到内存中,所以建立数据库连接的开销很大,尤其是在大量的并发访问时。假如某网站一天的访问量是10万,那么该网站的服务器就需要创建、断开连接10万次,频繁地创建、断开数据库连接会影响数据库的访问效率,甚至。

m0_60340721的博客 2432

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深入理解数据库连接池DBCP

1.DBCP简介DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时...

brushli的专栏 9068

数据库连接池技术 之 DBCP

DBCP的工作原理是,程序首先会初始化相应的数据库连接池,以供程序访问,当某个操作需要访问数据库时,程序会首先在连接池中取得空闲连接,如没有空闲连接在创建,用完之后归还连接池,这样达到了连接的重利用,不用频繁的创建连接和销毁,从而优化程序。DBCP常见属性有:driver:数据库驱动,如 com.mysql.jdbc.Driverurl:数据库连接,如 jdbc:mysql://localhost:3306/testDBusername:数据库用户名,如 root。

2401_85158559的博客 1321

数据库连接池之DBCP的使用

数据库连接池之dbcp 一、使用步骤: 1、引入相关jar包 1)JAVA通过jdbc访问mySQL数据库时需要导入的包: mysql-connector-java-5.1.37-bin.jar 2)使用数据库连接池技术必定要导入的包: commons-pool.jar 3)使用dbcp连接池时要使用的包: commons-dbcp-1.2.2.jar 2、引入properties文件 #数据库连接地址 #url=jdbc:mysql://localhost:3306/数据库名(?配置参数) url=jd

huangeight的博客 3146

DBCP数据库连接池以及在Tomcat中配置JNDI数据源

本地Tomcat的JNDI配置

weixin_52937170的博客 1944

Tomcat DBCP(Database Connection Pool) 数据库连接池入门介绍

Apache Tomcat DBCP(Database Connection Pool)是一个用于管理数据库连接的组件,通常与Apache Tomcat服务器一起使用。它提供了一种机制来有效地管理数据库连接,以便在高负载下提供更好的性能和可伸缩性。Tomcat DBCP通过创建和维护一组预先配置的数据库连接来管理连接池。这些连接在需要时可以被应用程序使用,并在不再需要时释放回池中。

1383

数据库连接池之DBCP连接池(mysql)

数据库连接池之DBCP连接池(mysql) 本仙又更博了,我是勤劳的小蜜蜂~ 1 DBCP简介 DBCP(DataBase connection pool): DBCP是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。 由于建立数据库连接是一个非常耗时的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一...

女神的博客 1592
上一篇: 20个非常不错的HTML5免费建站模板
下一篇: 燃烧字体哦,燃烧字体
程序员迈克
博客等级 码龄16年 36粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值