一、概述
没有连接池的情况下,我们每次请求数据库,都需要建立一次数据库连接,数据库的每次连接都非常消耗资源。连接池的作用就是预先创建比如十个连接,第一个用户连接使用完了,下一个用户还可以继续用连接池里面的这个连接。这样就大大节省了和数据库连接的次数。
二、C3p0配置。
- 下载包c3p0-0.9.1.2.jar、mysql-connector-java-5.0.8-bin.jar放入WEB-INF/Lib,然后记得add Build Path,不然写代码的时候,没法引用。Lib里面的jar包是服务运行的时候需要的。
- 在src底下建立一个文件夹c3p0-config.xml,先不要管为什么,就直接放入src目录底下,不要放入子目录。
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--默认配置-->
<default-config>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<!--配置连接池mysql-->
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/study</property>
<property name="user">root</property>
<property name="password">zjxn0916</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</named-config>
<!--配置连接池2-->
......
</c3p0-config>
- 编写数据源也称地址池,一下代码主要的是ComboPooledDataSource(“mysql”),ComboPooledDataSource这个是C3P0jar包里面的。通过这个自动从c3p0-config.xml读取信息。还要注意Connect、PreparedStatement 、ResultSet 都是从java.sql包里面取的,不要从jave.mysql里面取,有时间想想为什么,因为,我们引入mysql包,由C3P0按照java规范,实现了数据库的连接、语句操作。java的规范接口是最顶级的。我们不用关心C3P0怎么和mysql建立连接或者语句操作。我们用java的规范接口进行编程,然后由C3P0的实现类去做就ok了。
public class C3P0Util {
static org.apache.log4j.Logger logger=org.apache.log4j.Logger.getLogger(C3P0Util.class.getName());
//通过标识名来创建相应连接池
static ComboPooledDataSource dataSource=new ComboPooledDataSource("mysql");
//从连接池中取用一个连接
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (Exception e) {
logger.error("Exception in C3p0Utils!", e);
throw new Error("数据库连接出错!", e);
}
}
//释放连接回连接池
public static void close(Connection conn,PreparedStatement pst,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
logger.error("Exception in C3p0Utils!", e);
throw new Error("数据库连接关闭出错!", e);
}
}
if(pst!=null){
try {
pst.close();
} catch (SQLException e) {
logger.error("Exception in C3p0Utils!", e);
throw new Error("数据库连接关闭出错!", e);
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
logger.error("Exception in C3p0Utils!", e);
throw new Error("数据库连接关闭出错!", e);
}
}
}
}
- 语句测试:Test都用过吧,右键run as–Junit Test就直接执行此类了。
public class TestCRUD {
@Test
public void testInsert(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = C3P0Util.getConnection();
ps = conn.prepareStatement("insert into users(username) values('ggg')");
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
C3P0Util.close(conn, (com.mysql.jdbc.PreparedStatement) ps, rs);
}
System.out.println(conn.getClass().getName());
}
}