Web 07-3 c3p0dbcp连接池
Posted 皮卡丘比特斯拉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web 07-3 c3p0dbcp连接池相关的知识,希望对你有一定的参考价值。
1、连接池的概述
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、宕机。如下所示:
频繁的开关连接相当的耗费资源,所以我们可以设置一个连接池,在程序启动时就初始化一批连接,在程序中共享,需要连接时从池中获取,用完再还回池中,通过池共享连接,减少开关连接的次数,提高程序的效率。如下图所示:
2、c3p0和dbcp
连接池已经有开源的jar包供我们使用,下面介绍c3p0和dbcp两种连接池的使用。
a.c3p0
导入jar包,并添加到构建路径中去。
部分代码实现如下(省去异常处理):
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
ComboPooledDataSource source = new ComboPooledDataSource();
source.setDriverClass("com.mysql.jdbc.Driver");
source.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
source.setUser("root");
source.setPassword("886600");
conn = source.getConnection();
ps = conn.prepareStatement("select count(*) from user");
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1));
}
rs.close();
ps.close();
conn.close();
但是将信息写死到程序中到最后是很难修改的,所以一般都把配置信息写到配置文件中去。
利用配置文件,从官方给的文档当中发现c3p0有一个优点就是他会默认去项目的src目录下去寻找c3p0-config.xml文件,如果找不到,则会继续自动去寻找c3p0.properties文件。
c3p0-config.xml文件内容如下:
注意:xml的文件名字必须是c3p0-config.xml,并且property标签中的name属性的值是固定的,不能改变。
完整代码:
package cn.tedu.jdbc.c3p0;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0PoolDemo {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
ComboPooledDataSource source = new ComboPooledDataSource();
conn = source.getConnection();
ps = conn.prepareStatement("select count(*) from user");
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
rs = null;
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
ps = null;
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn = null;
}
}
}
}
}
控制台会出现一些红色的日志信息,只要没有warning和error就属于正常。
c3p0.properties文件内容如下,不用修改代码:
注意:properties文件名必须是c3p0.properties,而且等号前面的值也是固定的,不能改变。
结果也是一样的。
总结:
c3p0一共三种配置方式
**第一种:直接写死在程序中,不推荐,这样导致程序的灵活性很差。
**第二种:利用c3po-config.xml文件,要注意文件名和标签name属性。
**第三种:利用c3p0.properties文件,要注意文件名和等号前面的值不能错。
b.dbcp
利用dbcp实现连接池需要导入两个jar包,并添加到构建路径中去。
dbcp也分两种,第一种不用配置文件,也是不推荐的
部分代码如下(省去异常处理):
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
// 创建数据源
BasicDataSource source = new BasicDataSource();
source.setDriverClassName("com.mysql.jdbc.Driver");
source.setUrl("jdbc:mysql://localhost:3306/jdbc");
source.setUsername("root");
source.setPassword("886600");
conn = source.getConnection();
ps = conn.prepareStatement("select count(*) from user");
rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getString(1));
}
rs.close();
ps.close();
conn.close();
第二种就是从外部读取配置文件
配置文件内容如下:
注意:这种方式对配置文件的名字不做要求,但是等号之前的值是确定的,不能改变。
部分代码实现如下(省去异常处理):
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Properties prop = new Properties();
// 加载配置文件
prop.load(new FileReader(DBCPPoolDemo2.class
.getClassLoader().getResource("dbcp.properties").getPath()));
// 获取工厂对象
BasicDataSourceFactory factory = new BasicDataSourceFactory();
// 获取数据源
DataSource source = factory.createDataSource(prop);
// 获得连接
conn = source.getConnection();
ps = conn.prepareStatement("select count(*) from user");
rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getString(1));
}
rs.close();
ps.close();
conn.close();
3、比较
其实还有很多常用的开源连接池和商业连接池各有各自的优点。
dbcp
dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降。
此外不提供连接池监控。
c3p0
c3p0是另外一个开源的连接池,在业界也是比较有名的,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证。
此外不提供连接池监控。
更多详细内容还可参考
https://www.cnblogs.com/linjian/p/4831088.html
内容仅供个人学习记录使用,侵删
以上是关于Web 07-3 c3p0dbcp连接池的主要内容,如果未能解决你的问题,请参考以下文章
Spring —— 三种配置数据源的方式:spring内置c3p0dbcp
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段