DBUtils+C3P0连接池

今天学习了连接池和DBUtils

1.什么是连接池

连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。 

2.连接池的工作原理

第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。

第二、连接池的管理。当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。 当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。

该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。

第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。

3.常见的连接池:DBCP,C3P0

4.C3P0连接池的使用:

第一,导入jar包

第二,添加配置文件c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config><!--默认的连接-->
        <property name="user">root</property>
        <property name="password">填写密码</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/填写数据库名?serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=UTF-8</property>
    </default-config> 

<named-config name="oracle"><!--有命名的连接-->

<property name="driverClass">com.mysql.jdbc.Driver</property>

<property name="jdbcUrl">jdbc:mysql:///web_07</property>

<property name="user">root</property>

<property name="password">123</property>

</named-config>

</c3p0-config> 

第三,对连接池进行操作

public void testAddUser1() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            // 2.从池子中获取连接
            conn = C3P0Utils.getConnection();//这个构造函数无参,直接调用xml文件种默认的连接,有参则需和xml文件中的<named-config name="oracle">保持一致,此时直接调用这个连接
            String sql = "insert into tbl_user values(null,?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "吕布3");
            pstmt.setString(2, "貂蝉3");
            int rows = pstmt.executeUpdate();
            if (rows > 0) {
                System.out.println("添加成功!");
            } else {
                System.out.println("添加失败!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtils_V3.release(conn, pstmt, null);
        }
    }

5.DBUtils:DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。补充一下,传统操作数据库的类指的是JDBC

6.DBUtils两个核心类和一个接口:

DBUtils类
主要为关闭连接,装载JDBC驱动程序之类的常规工作提供方法,都是静态的方法

QueryRunner类
简化了执行SQL语句的代码它与ResultSetHandler组合在一起减少编码量

常用的方法:

1.query(Connection conn,String sql,ResultSetHandler rsh,Object[ ] params)
2.queryString sql,ResultSetHandler rsh,Object[ ] params)
3..query(Connection conn,String sql,ResultSetHandler rsh)
4.update(Connection conn,String sql,Object[ ] params)
5.update(Connection conn,String sql)
参数的意思分别为Connection conn:Connection类,String sql:要执行的sql语句,Object[ ] params:sql语句中的?的值 ResultSetHandler rsh:ResultSetHandler类

ResultSetHander接口
用于处理ResultSet结果集,将结果集的的数据转换成不同形式。

 

7.DBUtils+C3P0实现数据库的增删改查

思路:编写一个xx类,在类中获取连接

           编写Dao层,使用QueryRunner类执行sql语句,实现QueryRunner接收操作结果

C3P0xml文档如上

xx类

package DBUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;


public class DBUtils {
    private static DataSource dataSource = new ComboPooledDataSource();//自动加载xml文档

    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

    // 直接可以获取一个连接池
    public static DataSource getDataSource() {
        return dataSource;
    }

    // 获取连接对象
    public static Connection getConnection() throws SQLException {

        Connection con = tl.get();
        if (con == null) {
            con = dataSource.getConnection();
            tl.set(con);
        }
        return con;
    }

    // 开启事务
    public static void startTransaction() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.setAutoCommit(false);
        }
    }

    // 事务回滚
    public static void rollback() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.rollback();
        }
    }

    // 提交并且 关闭资源及从ThreadLocall中释放
    public static void commitAndRelease() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.commit(); // 事务提交
            con.close();// 关闭资源
            tl.remove();// 从线程绑定中移除
        }
    }

    // 关闭资源方法
    public static void closeConnection() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.close();
        }
    }

    public static void closeStatement(Statement st) throws SQLException {
        if (st != null) {
            st.close();
        }
    }

    public static void closeResultSet(ResultSet rs) throws SQLException {
        if (rs != null) {
            rs.close();
        }
    }
}

Dao层:

public class Dao {
     @Test
        public void delete() throws SQLException {
            QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
            String sql="delete from zhangziyi where zhanghao=?";
            qr.update(sql,"zhangziyi");        
        }
}
原文地址:https://www.cnblogs.com/wangzhaojun1670/p/12669025.html