数据库连接池


前言

数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。


一、 DBCP连接池

DBCP是一个依赖Jakartacommons-pool对象池机制的数据库连接池。DBCP可以直接的在应用程序中使用。

使用步骤

1.导入jar包

commons-dbcp-1.4.jar和commons-pool-1.5.6.jar

百度网盘连接:https://pan.baidu.com/s/1HEeYivITWRDRl1935uX6JgDBCP链接jar包 提取码:le29

2.具体实现代码

代码如下:

  1. 配置文件

dbcpconfig.properties

#连接设置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/hz?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=root

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=20

#<!-- 超时等待时间单位毫秒 -->
maxWait=60000


connectionProperties=userUnicode=true;characterEncoding=UTF8

defaultAutoCommit=true;

defaultReadOnly=

defaultTransactionIsolation=Read_UNCOMMITTED
  1. 实现类
    DbConnection_DBCP.java
package dao.common;

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

import javax.sql.DataSource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Date;
import java.util.Properties;

public class DbConnection_DBCP {

    private static DataSource dataSource = null;

    static {
        try {
            Properties pro = getDbInfo();
            //创建数据源     工厂模式
            dataSource = BasicDataSourceFactory.createDataSource(pro);


        }catch(Exception ex) {
            ex.printStackTrace();
        }
    }

    //获取连接
    public static Connection getConnection() throws SQLException{
        return dataSource.getConnection();
    }

    //释放连接资源
    public static void release(Connection con, PreparedStatement st, ResultSet set){

        try {
            if (con != null){
               con.close();
            }

            if (st != null){
                st.close();
            }

            if (set != null){
                set.close();
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }


    }

    private static Properties getDbInfo() {
        Properties pro = new Properties();
        try {
            //通过输入流对象读取文件中的数据保存在properties对象中
            pro.load(new FileInputStream(new File("src/dbcpconfig.properties")));
        } catch (IOException e) {
            System.out.println("数据库属性配置信息读取异常");
        }
        return pro;
    }

}

  1. 测试类

TestDBCP.java

package dao.common;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class TestDBCP {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet set = null;
        String sql = "select * from user";

        try{
            
            conn = DbConnection_DBCP.getConnection();
            st = conn.prepareStatement(sql);
            set = st.executeQuery();
            while (set.next()){
                System.out.println(set.getString(1));
            }
        }catch (Exception e){

        }finally {
            DbConnection_DBCP.release(conn,st,set);
        }
    }
}

二、C3P0连接池

C3P0:是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate 一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。

使用步骤

1.导入jar包

c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar

百度网盘链接:https://pan.baidu.com/s/1nP7aaMyIP6wdqG0r1ScGsw C3P0链接jar包 提取码:9k63

2.具体代码操作

  1. 配置xml文件
    注:.xml配置文件中的&符号需要转义成 &amp ;
    c3p0-config.xml
<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
  <!--
  C3p0的默认配置
  如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource();”这样写表示使用的是c3p0默认的配置
  -->
  <default-config>
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/hz?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</property>
    <property name="user">root</property>
    <property name="password">root</property>

    <property name="acquireIncrement">5</property>
    <property name="initialPoolSize">5</property>
    <property name="minPoolSize">10</property>
    <property name="maxPoolSize">20</property>
  </default-config>

  <!--
  c3p0的命名配置
  如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource(“MySQL”);”这样写表示使用的是name是MySQL的配置
  -->
  <named-config name="MySQL">
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/hz?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false</property>
    <property name="user">root</property>
    <property name="password">root</property>

    <property name="acquireIncrement">5</property>
    <property name="initialPoolSize">5</property>
    <property name="minPoolSize">10</property>
    <property name="maxPoolSize">20</property>
  </named-config>

</c3p0-config>
  1. 实现类

DbConnection_C3P0.java

package dao.common;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

public class DbConnection_C3P0 {

    private static DataSource dataSource = null;

    static {
        try {
            //代码配置
//            dataSource = new ComboPooledDataSource();
//            dataSource.setDriverClass();
//            dataSource.setUser();
//            dataSource.setPassword();
//            dataSource.setJdbcUrl();
            //创建数据源     工厂模式
            dataSource = new ComboPooledDataSource("MySQL");//配置文件写法


        }catch(Exception ex) {
            ex.printStackTrace();
        }
    }

    //获取连接
    public static Connection getConnection() throws SQLException{
        return dataSource.getConnection();
    }

    //释放连接资源
    public static void release(Connection con, PreparedStatement st, ResultSet set){

        try {
            if (con != null){
               con.close();
            }

            if (st != null){
                st.close();
            }

            if (set != null){
                set.close();
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }


    }

}

  1. 测试类

TestC3P0.java

package dao.common;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class TestC3P0 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet set = null;
        String sql = "select * from user";

        try{

            conn = DbConnection_C3P0.getConnection();
            st = conn.prepareStatement(sql);
            set = st.executeQuery();
            while (set.next()){
                System.out.println(set.getString(1));
            }
        }catch (Exception e){

        }finally {
            DbConnection_C3P0.release(conn,st,set);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值