概述:

Sun公司约定: 如果是连接池技术,需要实现一个接口!

javax.sql.DataSource;

     相关jar包和资料下载

1.1  DBCP连接池:

l  DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:

  • Commons-dbcp.jar:连接池的实现
  • Commons-pool.jar:连接池实现的依赖库

l  Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

l  核心类:BasicDataSource

l  使用步骤

  • 引入jar文件

l  commons-dbcp-1.4.jar

l  commons-pool-1.5.6.jar

示例代码

首先创建数据库的配置信息db.properties

url=jdbc:sqlserver://localhost:1433;DataBaseName=Test
username=sa
password=123456
driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
initialSize=3
maxActive=6
maxIdle=3000

开始编写测试类

package com.gqx.DBCP;

import static org.junit.Assert.*;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;
import com.jdbc.util.JDBCUtil; public class DBCPTest { @Test
public void test() {
//硬编码
//DBCP连接池核心类
BasicDataSource dataSource =new BasicDataSource();
//连接池参数配置,初始化连接,最大连接数/连接字符串,驱动,账号密密码
dataSource.setUrl("jdbc:sqlserver://localhost:1433;DataBaseName=Test");
dataSource.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
dataSource.setUsername("sa");
dataSource.setPassword("123456");
dataSource.setInitialSize(3); //初始化链接数目
dataSource.setMaxActive(6); //最大连接数目
dataSource.setMaxIdle(3000); //设置最大空闲时间 //获取连接
Connection connection=null;
PreparedStatement statement=null;
try {
connection=dataSource.getConnection();
String sql="insert into usershop values(?,?,?) ";
statement=connection.prepareStatement(sql);
statement.setInt(1, 2);
statement.setInt(2, 2);
statement.setInt(3, 4);
statement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtil.close(connection, statement);
}
} //根据配置文件获取连接
@Test
public void test2() throws Exception{
//加载properties加载配置文件
Properties prop=new Properties();
/**
* 类路径
* . 代表java命令运行的目录
* 在java项目下,. java命令的运行目录从项目的根目录开始
* 在web项目下, . java命令的而运行目录从tomcat/bin目录开始
* 所以不能使用点.
*/
InputStream in = DBCPTest.class.getResourceAsStream("db.properties");
prop.load(in);
//根据properties配置直接创建数据对象
DataSource dataSource=BasicDataSourceFactory.createDataSource(prop); //获取连接
Connection connection=null;
PreparedStatement statement=null;
try {
connection=dataSource.getConnection();
String sql="insert into usershop values(?,?,?) ";
statement=connection.prepareStatement(sql);
statement.setInt(1, 6);
statement.setInt(2, 3);
statement.setInt(3, 4);
statement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtil.close(connection, statement);
} } }

  


1.1  C3P0连接池:

C3P0连接池:

最常用的连接池技术!Spring框架,默认支持C3P0连接池技术!

C3P0连接池,核心类:

CombopooledDataSource ds;

使用:

  1. 下载,引入jar文件:  c3p0-0.9.1.2.jar
  2. 使用连接池,创建连接

代码示例

注意要按照c3p0的标准写一个xml文件(在c3p0的jar包的源代码文件中有实例),如我的xml配置文件,名称为“c3p0-config.xml”,这是规定,在使用其核心类的时候,它会自动加载src下名为c3p0-config.xml的文件

<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:sqlserver://localhost:1433;DataBaseName=教学库</property>
<property name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="user">sa</property>
<property name="password">123456</property>
<property name="maxIdleTime">3000</property>
<property name="maxPoolSize">6</property>
<property name="initialPoolSize">3</property>
</default-config> <named-config name="mysqlConfig">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_demo
</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">3</property>
<property name="maxPoolSize">6</property>
<property name="maxIdleTime">1000</property>
</named-config>
</c3p0-config>

再是测试类了

package com.gqx.C3P0;

import static org.junit.Assert.*;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; import org.junit.Test; import com.jdbc.util.JDBCUtil;
import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Demo {
//硬编码方式使用c3p0
@Test
public void test() throws Exception {
//创建连接池核心工具类
ComboPooledDataSource dataSource=new ComboPooledDataSource();
//设置连接处参数
dataSource.setJdbcUrl("jdbc:sqlserver://localhost:1433;DataBaseName=Test");
dataSource.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver");
dataSource.setUser("sa");
dataSource.setPassword("123456");
dataSource.setInitialPoolSize(3);
dataSource.setMaxPoolSize(6);
dataSource.setMaxIdleTime(3000); //从连接池对象中获取连接
Connection connection=null;
PreparedStatement statement=null;
try {
connection=dataSource.getConnection();
String sql="insert into usershop values(?,?,?) ";
statement=connection.prepareStatement(sql);
statement.setInt(1, 6);
statement.setInt(2, 4);
statement.setInt(3, 4);
statement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtil.close(connection, statement);
} } //根据配置文件获取连接
@Test
public void test2() throws Exception{
//创建连接池核心工具类
//自动加载src下叫做c3p0-config.xml的配置文件中的default-config
/**
* ComboPooledDataSource(config name)当要换数据库的时候(不适用默认数据库)
* 可以以字符串的形式输入在c3p0-config.xml中<named-config name="mysqlConfig">指定的参数
*/
ComboPooledDataSource dataSource=new ComboPooledDataSource(); //从连接池对象中获取连接
Connection connection=null;
PreparedStatement statement=null;
try {
connection=dataSource.getConnection();
String sql="insert into usershop values(?,?,?) ";
statement=connection.prepareStatement(sql);
statement.setInt(1, 2);
statement.setInt(2, 3);
statement.setInt(3, 4);
statement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtil.close(connection, statement);
}
} }

 由此,我可以把原来的JDBCUtil包重新改写一下,换成常用的c3p0技术,如下

package com.jdbc.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; import javax.activation.DataSource; import org.omg.CORBA.portable.InputStream; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JDBCUtil { //初始化连接池
private static ComboPooledDataSource dataSource;
/*
* 静态代码块只加载一次
*/
static{
dataSource=new ComboPooledDataSource();
} /**
* 获取JDBC连接对象的方法
*/
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
} /*
* 关闭操作
*/ public static void close(Connection con,Statement stmt){
if (stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
if (con!=null) {
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
} /**
* 这是方法的重载
* @param con
* @param stmt
* @param resultSet
*/
public static void close(Connection con,Statement stmt,ResultSet resultSet){
if (resultSet!=null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
if (con!=null) {
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}

还有就是网上说:dbcp没有自动的去回收空闲连接的功能,而c3p0有自动回收空闲连接功能。
一般c3p0使用的比较多

开源的连接池技术DBCP和C3P0的更多相关文章

  1. 解密httpclient,dbcp,jedis,c3p0,druid,okhttp都在使用的连接池技术

    最近在连接池上面栽了个跟头(参见这里),引起我对池技术的强烈关注,这几天总结了一下很多场景都会使用的池技术: 池概念 pool,中文翻译为水池,但是在英文中,还有一种解释是 an organizati ...

  2. 十七 Spring的JDBC模版:使用开源连接池,DBCP,C3P0

    DBCP的配置以及使用 引入jar包

  3. 采用DBCP连接池技术管理连接

    DBCP的使用步骤步骤一:导包,使用第三方的道具,必须导入相应的jar包. 一般需要导入两个jar包: -commons-dbcp-1.x.jar包 -commons-pool-1.x.x.jar包 ...

  4. 走进JavaWeb技术世界3:JDBC的进化与连接池技术

    走进JavaWeb技术世界3:JDBC的进化与连接池技术 转载公众号[码农翻身] 网络访问 随着 Oracle, Sybase, SQL Server ,DB2,  Mysql 等人陆陆续续住进数据库 ...

  5. JDBC连接池(三)DBCP连接池

    JDBC连接池(三)DBCP连接池 在前面的随笔中提到 了  1.JDBC自定义连接池  2. C3P0连接池 今天将介绍DBCP连接池 第一步要导入jar包   (注意:mysql和mysql 驱动 ...

  6. Spring的jdbc模板2:使用开源的连接池

    上篇简要介绍了如何在spring中配置默认的连接池和jdbc模板,这篇来介绍开源的连接池配置与属性引入 C3P0连接池配置: 引入jar包 配置c3p0连接池 <?xml version=&qu ...

  7. JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生

    一.为什么我们要用连接池技术? 前面的数据库连接的建立及关闭资源的方法有些缺陷.统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开.关闭该物理连接, 系统性能严重受损. 解 ...

  8. 线程池-连接池-JDBC实例-JDBC连接池技术

    线程池和连接池   线程池的原理:     来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客 ...

  9. 关于 Mybatis的原生连接池 和 DBCP 连接池

    一 遇到的问题:  项目用的play框架,数据库DB2, 持久化框架是Mybatis, 连接池用的是Mybatis原生的,遇到的问题是:有时候抛出如下异常: play.api.UnexpectedEx ...

随机推荐

  1. iOS开发之iOS程序偏好设置(Settings Bundle)的使用

    目录[-] 1.添加设置项 2.设置的控件 3.编辑设置项的文件 4.在程序中获取Settings 和写入Settings 添加UI 5.实现读取设置和保存代码 在Android手机上, 在某个程序里 ...

  2. 引用Excel时 未在本地计算机上注册ace.oledb.12.0

    可能由于未安装数据库补丁 下载地址http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/A ...

  3. bzoj 1455: 罗马游戏 左偏树+并查集

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 668  Solved: 247[Submit][Status] Descriptio ...

  4. 【JavaScript】JavaScript函数的参数

    要访问js函数中传入的所有参数,可以使用特殊的arguments变量.但是虽然可以像访问数组一样从arguments变量中读取参数,但arguments并非真正的数组.例如,arguments没有pu ...

  5. PYTHON不定参数与__DOC__

    def total(initial = 5, *numbers, **keywords): count = initial for number in numbers: count += number ...

  6. 找到个好的讲PYTHON FILE IO的文档,收藏

    现在我感觉快入门了哈, 这两天,可以用PYTHON写一点自己想要实现的东东了. 但文件,IO,编码,邮件,始终有点续不完全. 这个文档,我看行.. http://www.dabeaz.com/pyth ...

  7. Cxf + Spring3.0 入门开发WebService

    转自原文地址:http://sunny.blog.51cto.com/182601/625540/ 由于公司业务需求, 需要使用WebService技术对外提供服务,以前没有做过类似的项目,在网上搜寻 ...

  8. 用JAVA 查询 Active Directory(AD)

    Required Details LDAP address (For e.g.: myjeeva.com or IP of the Domain Controller/Global Catalog[G ...

  9. 江中微型统计分析软件V1.0版本完成

    中文名称:江中微型统计分析软件 英文名称: 项目名称:JXUTCMMSAS 项目地址:保密 在研究生最后历时1年的时间里,完成了江中微型统计分析软件V1.0,后续还在不断更新中,将自己的改进算法.机器 ...

  10. init进程 && 解析Android启动脚本init.rc && 修改它使不启动android && init.rc中启动一个sh文件

    Android启动后,系统执行的第一个进程是一个名称为init 的可执行程序.提供了以下的功能:设备管理.解析启动脚本.执行基本的功能.启动各种服务.代码的路径:system/core/init,编译 ...