Java学习笔记4-JDBC数据库连接池

为什么使用连接池呢? 当数据库访问量非常大的时候,普通的数据库直连方式对数据库的压力特别大,消耗资源,举个例子,假设我们有一个特别大的网站,访问量达到了几百万,如果用简单的数据库直连, 就需要建立几百万个数据库连接,很可能会导致数据库崩溃。

比较流行的几个开源数据库连接池的方式: DBCP, C3P0。
DBCP是spring推荐的,C3P0是hibernate推荐的,各有千秋,看情况而定。

下面是简单的使用例子:
DBCP:
首先, 需要的jar文件:
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
commons-logging-1.2.jar
其次在project下建立一个资源文件夹resource, 其中新建一个资源文件dbcp.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/ysong
username=root
password=mysql
maxActive=30
maxIdle=10
maxWait=1000
initialSize=5
minIdle=1
removeAbandoned=true
removeAbandonedTimeout=180

这个配置文件中是关于数据库连接池的基本配置。我们在代码中需要这些参数进行连接池的配置。
接下来就是在JDBC中使用连接池, 新建DBCPUtil类:

//数据源
    private static DataSource DS;
    private static final String configFile = "/dbcp.properties";
    //从数据源获得一个链接
    public Connection getConn(){
        Connection con = null;
        if(DS != null){
            try{
                con = DS.getConnection();
            }catch(Exception e){
                e.printStackTrace(System.err);
            }

            try{
                con.setAutoCommit(false);
            }catch(SQLException e){
                e.printStackTrace();
            }
            return con;
        }
        return con;
    }

    public DBCPUtil(){
        initDbcp();
    }

    private static void initDbcp(){
        Properties pops = new Properties();
        try{
            pops.load(Object.class.getResourceAsStream(configFile));
            DS = BasicDataSourceFactory.createDataSource(pops);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

上面的代码是通过我们的configFile进行配置,其实也可以进行手工配置参数,比如:

public static void initDS(String connectURI, String username, String pswd, String driverClass, int initialSize,int maxTotal, int maxIdle, int maxWait, int minIdle){
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(driverClass);
        ds.setUsername(username);
        ds.setPassword(pswd);
        ds.setUrl(connectURI);
        ds.setInitialSize(initialSize);
        ds.setMaxTotal(maxTotal);
        ds.setMaxIdle(maxIdle);
        ds.setMaxWaitMillis(maxWait);
        ds.setMinIdle(minIdle);
        DS = ds;
    }

效果是一样的,但是dbcp.properties的方式比较简单。
这样DBCP数据库连接池就配置好了,使用方式和直连的方式一样,但是运行起来的时间明显会少很多,速度变快。

接下来是C3P0的使用,过程和DBCP相似:
需要的jar文件:
c3p0-0.9.2-pre4.jar
mchange-commons-java-0.2.3.4.jar
同样的在resource文件夹下新建c3p0.properties配置文件:

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc\:mysql\://127.0.0.1\:3306/ysong
c3p0.user=root
c3p0.password=mysql

注意c3p0的配置文件有一个前缀c3p0.*
接下来,同样的C3P0Util类:


    //这个操作已经加载c3p0.properties配置文件
    private static ComboPooledDataSource ds = new ComboPooledDataSource();
    public static Connection getConnection(){
        try{
            return ds.getConnection();
        }catch(SQLException e){
            throw new RuntimeException(e);
        }
    }

其中ComboPooledDataSource这个类已经自动的加载了c3p0.properties配置文件。
这样c3p0数据库连接池的配置就完成了,使用方式一样。

这里顺便提一下,其他几个比较好用的JDBC替代产品, 比如commons-dbutils, hibernate, myBatis. 这些对数据库操作进行了一些封装,使用起来简单方便,可以尝试。

你可能感兴趣的:(JDBC-数据库连接)