开源的连接池技术DBCP和C3P0
概述:
Sun公司约定: 如果是连接池技术,需要实现一个接口!
javax.sql.DataSource;
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;
使用:
- 下载,引入jar文件: c3p0-0.9.1.2.jar
- 使用连接池,创建连接
代码示例
注意要按照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的更多相关文章
- 解密httpclient,dbcp,jedis,c3p0,druid,okhttp都在使用的连接池技术
最近在连接池上面栽了个跟头(参见这里),引起我对池技术的强烈关注,这几天总结了一下很多场景都会使用的池技术: 池概念 pool,中文翻译为水池,但是在英文中,还有一种解释是 an organizati ...
- 十七 Spring的JDBC模版:使用开源连接池,DBCP,C3P0
DBCP的配置以及使用 引入jar包
- 采用DBCP连接池技术管理连接
DBCP的使用步骤步骤一:导包,使用第三方的道具,必须导入相应的jar包. 一般需要导入两个jar包: -commons-dbcp-1.x.jar包 -commons-pool-1.x.x.jar包 ...
- 走进JavaWeb技术世界3:JDBC的进化与连接池技术
走进JavaWeb技术世界3:JDBC的进化与连接池技术 转载公众号[码农翻身] 网络访问 随着 Oracle, Sybase, SQL Server ,DB2, Mysql 等人陆陆续续住进数据库 ...
- JDBC连接池(三)DBCP连接池
JDBC连接池(三)DBCP连接池 在前面的随笔中提到 了 1.JDBC自定义连接池 2. C3P0连接池 今天将介绍DBCP连接池 第一步要导入jar包 (注意:mysql和mysql 驱动 ...
- Spring的jdbc模板2:使用开源的连接池
上篇简要介绍了如何在spring中配置默认的连接池和jdbc模板,这篇来介绍开源的连接池配置与属性引入 C3P0连接池配置: 引入jar包 配置c3p0连接池 <?xml version=&qu ...
- JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生
一.为什么我们要用连接池技术? 前面的数据库连接的建立及关闭资源的方法有些缺陷.统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开.关闭该物理连接, 系统性能严重受损. 解 ...
- 线程池-连接池-JDBC实例-JDBC连接池技术
线程池和连接池 线程池的原理: 来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客 ...
- 关于 Mybatis的原生连接池 和 DBCP 连接池
一 遇到的问题: 项目用的play框架,数据库DB2, 持久化框架是Mybatis, 连接池用的是Mybatis原生的,遇到的问题是:有时候抛出如下异常: play.api.UnexpectedEx ...
随机推荐
- POJ 3267 The Cow Lexicon 简单DP
题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...
- Mvc学习笔记(4)
上文我介绍了如何将控制器里的值传递给视图,但是是如何传递的呢?原理是什么? 视图 page.cshtml在编译的时候也会编译成一个类,然而这个类会继承于WebViewPage<object> ...
- Js 简单分页(二)
此次使用了http://www.purecss.org/ 的前端Css 效果图 上代码 //更新分页工具栏的效果展示 function updatepagetoolshow(){ //判断当前页 及 ...
- 第 16 章 观察者模式【Observer Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> <孙子兵法>有云:“知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知 ...
- bzoj 3858: Number Transformation 暴力
3858: Number Transformation Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 82 Solved: 41[Submit][Sta ...
- matlab中 hold on 与hold off的用法
matlab中 hold on 与hold off的用法 hold on 是当前轴及图形保持而不被刷新,准备接受此后将绘制 hold off 使当前轴及图形不在具备被刷新的性质 hold on 和ho ...
- Celery Flower监控,完美搞定
XXXX啊,,从上午就看到QUEQUE有问题,但一直不晓得哪里出了问题, 后来,安装上FLOWER看一下,队列就出来了... 神器啊.. 安装不说,运行很EASY.. celery flower -A ...
- 使用VisualStudio2010创建C#应用程序
打开VisualStudio2010,选择“文件”——“新建”——“项目”菜单命令.调出“新建项目”对话框.
- [转贴]Windows下gSoap交叉编译环境的搭建
本人直接就用过gSoap,它是用以C/C++写webservice的利器 交叉编译的时候,有两个很关键的程序: soapcpp2.exe wsdl2h.exe ...
- Windows编程中的堆管理(过于底层,一般不用关心)
摘要: 本文主要对Windows内存管理中的堆管理技术进行讨论,并简要介绍了堆的创建.内存块的分配与再分配.堆的撤销以及new和delete操作符的使用等内容. 关键词: 堆:堆管理 1 引言 在大多 ...