zoukankan      html  css  js  c++  java
  • JDBC 06: 连接池 / 数据源

     0.          什么是连接池 / 数据源?

        连接池是一个集合, 用来保存多个连接(Connection)

    1.  为什么需要连接池/数据源?

        <1>  为了避免重复地创建Connection

        < 2 >       节约资源

    2.    创建连接池 / 数据源

    public class JDBCUtils {
    
        private static final String connectionURL = "jdbc:mysql://localhost:3306/web01?useUnicode=true&characterEncoding=UTF8&useSSL=false";
        private static final String username = "root";
        private static final String password = "root";
        
        private static ArrayList<Connection> conlist = new ArrayList<Connection>();
        static {
            for(int i=0;i<5;i++) { // 连接池的容量为5
                Connection con = createConnection();
                conlist.add(con);
            }
        }
        public static Connection getConnection() {
            if(conlist.isEmpty() == false) { 
                Connection con = conlist.get(0); 
                conlist.remove(con);
                return con; // 连接借用
            }else {
                return createConnection();
            }
        }
        private static Connection createConnection() {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                return DriverManager.getConnection(connectionURL,username,password);
            }catch(Exception e) {
                e.printStackTrace();
            }
            
            return null;
        }
        private static void closeConnection(Connection con) {
            conlist.add(con); // 连接归还
        }
    }    

    3. 第三方连接池 - dbcp

    public class DOCPDataSource {
        private static final String connectionURL = "jdbc:mysql://localhost:3306/web01?useUnicode=true&characterEncoding=UTF8&useSSL=false";
        private static final String username = "root";
        private static final String password = "root";
        
        private static BasicDataSource ds;
        
        static {
            // 初始化dbcp 数据源
            BasicDataSource ds = new BasicDataSource();
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            ds.setUrl(connectionURL);
            ds.setUsername(username);
            ds.setPassword(password);
            
            ds.setInitialSize(5); // 初始连接个数:    5
            ds.setMaxTotal(20);   // 允许最大连接个数: 20
            ds.setMinIdle(3);     // 设置最少连接个数: 3
        }
        
        public Connection getConnection() {
            try {
                return ds.getConnection(); // 通过dbcp得到的连接,不需要归还,直接close就可以
            }catch(SQLException e) {
                e.printStackTrace();
            }
            return null;
        }
        
        private static void closeConnection(Connection con) {
            try {
                if(con!=null) {
                    con.close(); // 这里会把连接归还給dbcp连接池,并不是真正的断开连接
                }
            } catch(SQLException e) {
                e.printStackTrace();
            }
            
        }
    }

    4. 第三方连接池  - C3P0

    package com.Jasper2003.jdbc01;
    
    import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class C3P0DataSource {
        
        private static final String connectionURL = "jdbc:mysql://localhost:3306/web01?useUnicode=true&characterEncoding=UTF8&useSSL=false";
        private static final String username = "root";
        private static final String password = "root";
        
        private static ComboPooledDataSource ds;
        
        static {
            try {
                ds = new ComboPooledDataSource();
                ds.setDriverClass("com.mysql.jdbc.Driver");
                ds.setJdbcUrl(connectionURL);
                ds.setUser(username);
                ds.setPassword(password);
                
                ds.setInitialPoolSize(5); // 初始连接个数:    5
                ds.setMaxPoolSize(20);   // 允许最大连接个数: 20
            }catch(PropertyVetoException e) {
                e.printStackTrace();
            }
        }
        
        public static Connection getConnection() {
            try {
                return ds.getConnection(); 
            }catch(SQLException e) {
                e.printStackTrace();
            }
            return null;
        }
        
        private static void closeConnection(Connection con) {
            try {
                if(con!=null) {
                    con.close(); 
                }
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
        
        public static void close(ResultSet rs, Statement stmt, Connection con) {
            closeResultSet(rs);
            closeStatement(stmt);
            closeConnection(con);
        }
        
        public static void close(Statement stmt1,Statement stmt2, Connection con) {
    
            closeStatement(stmt1);
            closeStatement(stmt2);
            closeConnection(con);
            
        }
        
        private static void closeResultSet(ResultSet rs) {
            try {
                if(rs!=null)
                    rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        private static void closeStatement(Statement stmt) {
            try {
                if(stmt!=null)
                    stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    Django
    MySql、Mongodb和Redis的区别
    数据库读写分离之配置Django实现数据库读写分离
    MySQL数据库优化
    01--web框架本质 wsgiref模块介绍
    CI上传图片 The filetype you are attempting to upload is not allowed.
    微信小程序 swiper和video的autoplay设置冲突问题
    关于手机端页面使用border-radius:50%不能使用div变为圆形问题
    微信小程序支付获取params的时候使用JsApiPay失败
    小程序使用笔记
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/13544189.html
Copyright © 2011-2022 走看看