您的位置:首页 > 运维架构 > Apache

数据库连接池-DBCP (Apache Database Connection pool)

2014-01-03 16:11 435 查看

第三方数据库连接池包

DBCP - Apache – DataBase Connection Pool 1.1

C3p0 – 0.9 –

Proxool -

第一步:导入dbcp包



第二步:通过核心类连接数据

BasicDataSource它是javax.sql.DataSrouce的子类。

一个工具类:BasicDataSourceFactory。
@Test
public void testpool1() throws Exception {
BasicDataSource ds = new BasicDataSource();
// 设置driver
ds.setDriverClassName("com.mysql.jdbc.Driver");
// 设置url
ds.setUrl("jdbc:mysql:///db909?characterEncoding=UTf8");
ds.setPassword("");
ds.setUsername("root");
ds.setMaxActive(5);// 设置最多有几个连接
ds.setInitialSize(2);// 设置在开始时创建几个连接
// ..................下面几乎不需要调用
ds.setDefaultAutoCommit(true);// 设置所有连接是否自动提交
ds.setMaxIdle(3000);// 设置每个连接最大的空闲时间

Connection c1 = ds.getConnection();
Connection c2 = ds.getConnection();
Connection c3 = ds.getConnection();
Connection c4 = ds.getConnection();
Connection c5 = ds.getConnection();
System.err.println("c1:" + c1.hashCode() + "," + c1.getClass());// com.mysql.jdbc.Jdbc4Connection@11111,
System.err.println("c2:" + c2.hashCode());// cn.itcast.MyDataSource$MyConn@11111
System.err.println("c3:" + c3.hashCode());
System.err.println("c4:" + c4.hashCode());
System.err.println("c5:" + c5.hashCode());
c2.close();
Connection c6 = ds.getConnection();
System.err.println("c6:" + c6.hashCode());
}

第三步:创建一个资源文件

在dbcp中一个类专门用于读取资源文件的:

BasicDataSourceFactory

/**
* 通过配置文件创建连接
*/
@Test
public void testPool2() throws Exception {
Properties p = new Properties();
p.load(DbcpPool.class.getResourceAsStream("jdbc.properties"));
DataSource ds = new BasicDataSourceFactory().createDataSource(p);
Connection c1 = ds.getConnection();
Connection c2 = ds.getConnection();
Connection c3 = ds.getConnection();

System.err.println(c1.hashCode() + "," + c1.getClass());
System.err.println("c2:" + c2.hashCode());
System.err.println("c3:" + c3.hashCode());
c3.close();
Connection c4 = ds.getConnection();
System.err.println("c4:" + c4.hashCode());
}


jdbc.properties文件与类在一个包里
以下所有属性,都来自于BaiscDataSource的setXxxx

#以下所有属性,都来自于BaiscDataSource的setXxxx
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db909?useUnicode=true&characterEncoding=UTF8&useOldAliasMetadataBehavior=true
username=root
password=
maxActive=3

三使用连接池

在一个项目中,就只能拥有一个DataSource的实例。在这个dataqSource3中有多个Connectioin。

声明一个工厂类,创建维护唯一的一个DataSource

public class DataSourceUtils {
private DataSourceUtils(){}
private static DataSource ds;
static{
try{
Properties p =
new Properties();
p.load(DataSourceUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
ds =
new BasicDataSourceFactory().createDataSource(p);
}catch(Exception e){}
}
//返回一个唯一的连接
public static Connection getCon(){
Connection con = null;
try {
con = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
//提供一个方法返回DataSource
public static DataSource getDs(){
return ds;
}
}

@Test
public void query1(){
Connection con1 = DataSourceUtils.getCon();
Connection con2 = DataSourceUtils.getCon();
System.err.println(con1==con2);//faslse

DataSource ds1 = DataSourceUtils.getDs();
DataSource ds2 = DataSourceUtils.getDs();
System.err.println(ds1==ds2);//true
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: