Web 07-3 c3p0dbcp连接池

Posted 皮卡丘比特斯拉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web 07-3 c3p0dbcp连接池相关的知识,希望对你有一定的参考价值。

1、连接池的概述


用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、宕机。如下所示:


频繁的开关连接相当的耗费资源,所以我们可以设置一个连接池,在程序启动时就初始化一批连接,在程序中共享,需要连接时从池中获取,用完再还回池中,通过池共享连接,减少开关连接的次数,提高程序的效率。如下图所示:

Web 07-3 c3p0、dbcp连接池


2、c3p0和dbcp


连接池已经有开源的jar包供我们使用,下面介绍c3p0和dbcp两种连接池的使用。

a.c3p0

导入jar包,并添加到构建路径中去。

Web 07-3 c3p0、dbcp连接池

部分代码实现如下(省去异常处理):

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文件内容如下:

Web 07-3 c3p0、dbcp连接池


注意: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就属于正常。

Web 07-3 c3p0、dbcp连接池


c3p0.properties文件内容如下,不用修改代码:

Web 07-3 c3p0、dbcp连接池


注意: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连接池的主要内容,如果未能解决你的问题,请参考以下文章

JBoss 数据库连接池

Spring —— 三种配置数据源的方式:spring内置c3p0dbcp

jedis连接redis

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

数据库连接池proxool的两种使用方式

web java -- 连接池 -- 概述