java--开源数据库连接池(dbcp数据源)

Posted xanlv

tags:

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

现在很多WEB服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
也有一些开源组织提供了数据源的独立实现:
        DBCP 数据库连接池
        C3P0 数据库连接池
实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。
DBCP数据源
DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:
        Commons-dbcp.jar:连接池的实现
        Commons-pool.jar:连接池实现的依赖库
Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

dbcp数据库连接池的两种实现方式

package cn.hncu.dbcp;

import java.sql.Connection;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;

public class DbcpPoolDemo 

    //dbcp数据库连接池----BasicDataSource类对象

    //使用配置文件的方式--利用BasicDataSourceFactory工厂类+Properties的方式创建,参数直接从配置文件读取
    @Test
    public void demo2() throws Exception
        Properties p=new Properties();
        //src目录下的--配置文件放在classpath下,则可用下面一行来获取
//      p.load(DbcpPoolDemo.class.getClassLoader().getResourceAsStream("dbcp.properties"));
        //配置文件和当前类放在一起
        p.load(DbcpPoolDemo.class.getResourceAsStream("dbcp2.properties"));
        DataSource pool=BasicDataSourceFactory.createDataSource(p);
//      Connection con=pool.getConnection();
//      System.out.println("con:"+con);
        for(int i=0;i<30;i++)//默认是八个,可以通过资源文件(dbcp2.properties)更改 

            Connection con=pool.getConnection();
            System.out.println(con.hashCode());//输出8个(pool.getMaxActive())之后就阻塞了
        

    
    @Test//纯Java方式 ---利用空参构造方式BasicDataSource()创建,然后通过setter方法手动设置参数
    public void demo1() throws Exception
        BasicDataSource pool=new BasicDataSource();
        pool.setDriverClassName("com.mysql.jdbc.Driver");
        pool.setUrl("jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=utf-8");
        pool.setUsername("root");
        pool.setPassword("1234");
//      Connection con=pool.getConnection();
//      System.out.println(con);

        System.out.println("初始连接的个数:"+pool.getInitialSize());//0
        System.out.println("最多能有几个在用的连接:"+pool.getMaxActive());//8
        System.out.println("最多空闲多长时间(若没使用该连接就收回):"+pool.getMaxIdle());//8
        System.out.println("最多等待多长时间(若没获得连接就抛出异常):"+pool.getMaxWait());//-1
        //可以自己更改池的参数
        pool.setMaxActive(10);
        /*
         * 以下测试从池获取多个连接
         */
        for(int i=0;i<15;i++)
            Connection con=pool.getConnection();
            System.out.println(con.hashCode());//输出8个(pool.getMaxActive())之后就阻塞了
            if(i%2==0)//dbcp池中如果有最近使用的连接con,就不会新开一个连接con,而是使用最近用的con
                con.close();
            
        
        System.out.println("Over....");
    

dbcp.properties放在src目录下

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=utf-8
username=root
password=1234
size=3

开源数据库连接池

package cn.hncu.dbcp;

import java.sql.Connection;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DbcpUtils 
    //本地线程管理对象,用于实现: 同一个线程获取的连接是同一个
    private static ThreadLocal<Connection> t = new ThreadLocal<Connection>();

    private static DataSource pool = null;
    static
        Properties p = new Properties();
        try 
            //配置文件和当前类放在一起
            p.load(DbcpUtils.class.getResourceAsStream("dbcp2.properties"));

            pool= BasicDataSourceFactory.createDataSource(p);
         catch (Exception e) 
            e.printStackTrace();
        
    

    public static Connection getConn() 
        //先从t中拿,如果有就拿出去,如果没有再到池中拿且把该对象放到t中
        Connection con = t.get();
        if(con==null)
            try 
                con=pool.getConnection();
                t.set(con); //放到t中
             catch (Exception e) 
                throw new RuntimeException(e.getMessage(), e);
            
        
        System.out.println("获取一个连接:"+con);
        return con;
    


dbcp2.properties和当前类放在一起

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=utf-8
username=root
password=1234
maxActive=15
package cn.hncu.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.UUID;

import org.junit.Test;

import cn.hncu.dbcp.DbcpUtils;

public class DbcpTest 

    @Test
    public void demo() throws Exception
        Connection con=DbcpUtils.getConn();
        System.out.println("demo-con:"+con);
        try 
            con.setAutoCommit(false);
            saveStud();
            saveStud2();
            con.commit();
            System.out.println("提交一个事务...");
         catch (SQLException e) 
            con.rollback();
            System.out.println("回滚一个事务...");
        finally
            con.setAutoCommit(true);//还原现场
            con.close();
        

    

    public void saveStud() throws Exception
        Connection con=DbcpUtils.getConn();
        System.out.println("saveStud-con:"+con);
        String sql="INSERT INTO stud VALUES(?,?)";
        PreparedStatement pst=con.prepareStatement(sql);
        for(int i=0;i<2;i++)
            String id=UUID.randomUUID().toString().replace("-", "");
            pst.setString(1, id);
            pst.setString(2, "stud"+i);
            pst.addBatch();
        
        pst.executeBatch();
    
    public void saveStud2() throws Exception
        Connection con=DbcpUtils.getConn();
        System.out.println("saveStud2-con:"+con);
        String sql="insert into stud values(?,?)";
        PreparedStatement pst=con.prepareStatement(sql);
        for(int i=3;i<5;i++)
            String id=UUID.randomUUID().toString().replace("-", "");
            pst.setString(1, id);
//          pst.setString(1, "70e56717e7634c9c85aefcad6560afd1");//测试事务回滚
            pst.setString(2, "stud"+i);
            pst.addBatch();
        
        pst.executeBatch();
    

以上是关于java--开源数据库连接池(dbcp数据源)的主要内容,如果未能解决你的问题,请参考以下文章

JDBC 学习复习7 学习 Apache 开源DBCP 数据源

java数据库连接池比较

Java学习:数据库连接池DBCP的使用

spring02

c3p0,dbcp与druid 三大连接池的区别[转]

连接池