第三方数据库连接池包
DBCP - Apache – DataBase Connection Pool 1.1
C3p0 – 0.9 –
Proxool -
C3p0 – 0.9 –
Proxool -
第一步:导入dbcp包
第二步:通过核心类连接数据
BasicDataSource它是javax.sql.DataSrouce的子类。
一个工具类:BasicDataSourceFactory。
一个工具类: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
声明一个工厂类,创建维护唯一的一个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
}