概述:

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. POJ 3267 The Cow Lexicon 简单DP

    题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...

  2. Mvc学习笔记(4)

    上文我介绍了如何将控制器里的值传递给视图,但是是如何传递的呢?原理是什么? 视图 page.cshtml在编译的时候也会编译成一个类,然而这个类会继承于WebViewPage<object> ...

  3. Js 简单分页(二)

    此次使用了http://www.purecss.org/ 的前端Css 效果图 上代码 //更新分页工具栏的效果展示 function updatepagetoolshow(){ //判断当前页 及 ...

  4. 第 16 章 观察者模式【Observer Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> <孙子兵法>有云:“知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知 ...

  5. bzoj 3858: Number Transformation 暴力

    3858: Number Transformation Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 82  Solved: 41[Submit][Sta ...

  6. matlab中 hold on 与hold off的用法

    matlab中 hold on 与hold off的用法 hold on 是当前轴及图形保持而不被刷新,准备接受此后将绘制 hold off 使当前轴及图形不在具备被刷新的性质 hold on 和ho ...

  7. Celery Flower监控,完美搞定

    XXXX啊,,从上午就看到QUEQUE有问题,但一直不晓得哪里出了问题, 后来,安装上FLOWER看一下,队列就出来了... 神器啊.. 安装不说,运行很EASY.. celery flower -A ...

  8. 使用VisualStudio2010创建C#应用程序

    打开VisualStudio2010,选择“文件”——“新建”——“项目”菜单命令.调出“新建项目”对话框.

  9. [转贴]Windows下gSoap交叉编译环境的搭建

    本人直接就用过gSoap,它是用以C/C++写webservice的利器     交叉编译的时候,有两个很关键的程序:         soapcpp2.exe         wsdl2h.exe ...

  10. Windows编程中的堆管理(过于底层,一般不用关心)

    摘要: 本文主要对Windows内存管理中的堆管理技术进行讨论,并简要介绍了堆的创建.内存块的分配与再分配.堆的撤销以及new和delete操作符的使用等内容. 关键词: 堆:堆管理 1 引言 在大多 ...