连接池的使用-C3P0与DBCP
什么是连接池?
之前jdbc步骤: 获取连接 -> 得到Statement->发送sql -> 关闭连接
通讯录系统:CURD 四次
问题:获取连接对象需要消耗比较多的资源,而每次操作都要重新获取新的连接对象,执行一次操作就把连接关闭,这样连接对象的使用效率并不高!!!
办法:能不能让连接对象反复使用???如果可以的话,连接对象使用率提高!这就可以用连接池实现!!、
DBCP连接池
DBCP: DataBase Connection Pool
1)Apache旗下的软件,开源连接池
2)Tomcat的服务器的连接池默认实现
使用步骤:
1)导入dbcp的jar包
commons-dbcp-1.4.jar 核心包
commons-pool-1.5.6.jar辅助包
2)创建连接池对象BasicDataSource对象
3)设置连接参数(url,user,password,dirverClass)
4)设置连接池参数(初始连接数,最大连接数,最大等待时间)
5)获取连接对象(getConnection() 方法)
url=jdbc:mysql://localhost:3306/day18
username=root
password=root
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=12
maxWait=5000
/**
* 使用配置文件方式
*/
//4)获取连接
try {
//1)使用工厂类来创建dbcp连接池对象(读取配置文件方式)
Properties prop = new Properties();
//使用类路径读取配置文件
InputStream in = Demo1.class.getResourceAsStream("/jdbc.properties");
//加载配置文件
prop.load(in);
BasicDataSource bds = (BasicDataSource)BasicDataSourceFactory.createDataSource(prop);
/**
* 读取jdbc.properties文件内容
* dbcp可以自动识别每个配置信息,但是约定前提: 配置文件的key名称和设置方法的名称保持一致!!!
*/
//从连接池中获取连接
for(int i=1;i<=13;i++){
Connection conn = bds.getConnection(); //注意: 这里返回的Connection对象,不是原来的Connection,而是代理后的Connection对象
System.out.println(conn);
//注意: 使用连接池,记住释放连接
/* if(i==3){
conn.close();// 把连接对象放回连接池中的。连接池中最大能够保存最大连接数的连接对象
}*/
}
} catch (Exception e) {
e.printStackTrace();
}
C3P0连接池
特点:
1)开源连接池
2)Hibernate框架,默认推荐使用C3P0作为连接池实现
使用步骤:
1)导入c3p0的jar包 c3p0-0.9.1.2.jar 核心包
2)创建连接池对象ComboPooledDataSource对象
3)设置连接参数(url,user,password,dirverClass)
4)设置连接池参数(初始连接数,最大连接数,最大等待时间)
5)获取连接对象(getConnection() 方法)
<c3p0-config>
<!-- 默认配置 -->
<default-config>
<!-- 连接参数 -->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day18</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">12</property>
<property name="checkoutTimeout">5000</property>
<property name="minPoolSize">3</property>
</default-config>
<!-- 命名配置 -->
<named-config name="oracle">
<!-- 连接参数 -->
<property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="user">eric</property>
<property name="password">123456</property>
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">12</property>
<property name="checkoutTimeout">5000</property>
<property name="minPoolSize">3</property>
</named-config>
</c3p0-config>
/**
* 使用xml配置文件读取c3p0的方法
* 注意:
* 1)需要把一个名称为c3p0-config.xml文件放在src目录下,c3p0会自动读取这个文件。
* 2)xml配置文件中属性名称和手动设置方法名保持一致!!!!c3p0则会自动读取
*/
//1)创建连接池对象
/**
* 1)new ComboPooledDataSource(): 使用没有参数的构造方法,读取的是default-config的配置信息
* 2)new ComboPooledDataSource(name的属性值): 使用有参的构造方法,读取的是name-config配置信息
*/
//ComboPooledDataSource cds = new ComboPooledDataSource();
ComboPooledDataSource cds = new ComboPooledDataSource("oracle");
//2)获取连接
for(int i=1;i<=13;i++){
Connection conn = cds.getConnection();
System.out.println(conn);
//关闭第3个
if(i==3){
conn.close();//本质是把连接对象放回连接池中
}
}