zoukankan      html  css  js  c++  java
  • 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");        
            }
    }
  • 相关阅读:
    大战设计模式【5】—— 工厂方法模式
    通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离
    大战设计模式【4】—— 简单工厂模式
    大战设计模式【3】—— 装饰模式
    大战设计模式【2】—— 观察者模式
    大战设计模式【1】—— 策略模式
    回顾:maven配置和常用命令整理
    idea properties文件unicode码问题
    Nginx学习笔记
    tomcat添加context方式部署web应用
  • 原文地址:https://www.cnblogs.com/wangzhaojun1670/p/12669025.html
Copyright © 2011-2022 走看看