• Java 之 数据库连接池


    一、数据库连接池

      1、连接池概念

        连接池其实就是一个容器(集合),存放数据库连接的容器。

        当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问之后,会将连接对象归还给容器

      2、连接池好处

        ① 节约资源(不必没连接一次数据都去创建一个 Connection 对象)

        ② 用户访问高效(每次连接只需要从数据库连接池中获取连接即可,不用等待连接数据库的漫长过程)

      3、实现

        (1)标准接口:DataSource  在 javax.sql 包下

            常用方法

    获取连接:getConnection()
    归还连接:Connection.close()。如果连接对象
    

           Connection 是从连接池中获取的,那么调用 Connection.close() 方法,则不会再关闭连接了,而是归还连接。

        (2)接口的实现,一般不需要我们去实现,有数据库厂商来实现

          ① C3P0:数据库连接池技术

          ② Druid:数据库连接池技术,由阿里巴巴提供

    二、C3P0 连接池

      1、C3P0 数据库连接池技术实现步骤

    1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar (注意:因为是连接数据库,不要忘记导入数据库驱动 jar 包)
    2. 定义配置文件:
         名称:c3p0.properties 或 c3p0-config.xml(名字必须为这两个中一个,因为会自动加载配置文件)
         路径:直接将文件放置 src 目录下即可。  
    3. 创建核心对象  数据库连接池对象 ComboPooledDataSource
    4. 获取连接:getConnection()
    

        代码实现

     1 public static void main(String[] args) throws SQLException {
     2         // 创建数据库连接对象
     3         DataSource ds = new ComboPooledDataSource();  // 会自动去加载配置文件
     4 
     5         //获取连接对象
     6         Connection conn = ds.getConnection();
     7 
     8         // 打印连接对象
     9         System.out.println(conn);
    10         
    11         // 归还对象
    12         conn.close();
    13  }

      2、导入的 jar 包

        

      3、配置文件

        c3p0-config.xml 配置文件

     1 <c3p0-config>
     2   <!-- 使用默认的配置读取连接池对象 -->
     3   <default-config>
     4       <!--  连接参数 -->
     5     <property name="driverClass">com.mysql.jdbc.Driver</property>
     6     <property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property>
     7     <property name="user">root</property>
     8     <property name="password">root</property>
     9     
    10     <!-- 连接池参数 -->
    11     <!--初始化连接的数量-->
    12     <property name="initialPoolSize">5</property>
    13     <!--最大的连接数量-->
    14     <property name="maxPoolSize">10</property>
    15     <!--超时时间-->
    16     <property name="checkoutTimeout">3000</property>
    17   </default-config>
    18 
    19   <!--通过指定的名字来获取连接的数据库-->
    20   <named-config name="otherc3p0"> 
    21     <!--  连接参数 -->
    22     <property name="driverClass">com.mysql.jdbc.Driver</property>
    23     <property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property>
    24     <property name="user">root</property>
    25     <property name="password">root</property>
    26     
    27     <!-- 连接池参数 -->
    28     <property name="initialPoolSize">5</property>
    29     <property name="maxPoolSize">8</property>
    30     <property name="checkoutTimeout">1000</property>
    31   </named-config>
    32 </c3p0-config>

        注意:在配置文件中可以连接多个不同的数据库,用<name-config> 声明即可,到时候使用 name 属性来调用即可,如果没有指定 name,那么调用默认的数据库。

         Demo:

     1 public static void main(String[] args) throws SQLException {
     2         // 创建数据库连接对象
     3         //DataSource ds = new ComboPooledDataSource("");        //连接默认的数据库
     4         DataSource ds = new ComboPooledDataSource("otherc3p0"); //连接 name=otherc3p0数据库
     5 
     6         //2 获取连接
     7         Connection conn = ds.getConnection();
     8 
     9         Statement stmt = conn.createStatement();
    10 
    11         // 3.归还连接
    12         conn.close();
    13 
    14     }

    三、Druid 连接池

      1、Druid 数据库连接池技术实现步骤

    1. 导入 jar 包druid-1.0.9.jar
    2. 定义配置文件
           名称:是properties 形式的,需要手动加载
           路径:可以放在任意目录下(建议放在src目录下)
    3. 加载配置文件 properties
    4. 获取数据连接池对象:通过工厂来获取 DruidDataSourceFactory
    5. 获取连接:getConnection
    6. 归还连接:close()
    

        代码实现

     1 public class DruidDemo1 {
     2     public static void main(String[] args) throws Exception {
     3         //1.导入jar包
     4         //2.定义配置文件
     5 
     6         //3.加载配置文件
     7         Properties prop = new Properties();
     8         InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
     9         prop.load(is);
    10 
    11         //4.获取连接池对象
    12         DataSource ds = DruidDataSourceFactory.createDataSource(prop);
    13 
    14 
    15         //5.获取连接
    16         Connection conn = ds.getConnection();
    17         System.out.println(conn);
    18         
    19         // 6.归还连接
    20         conn.close();
    21     }
    22 }

      2、导入 jar 包

          

      3、配置文件

        druid.properties 文件

     1 driverClassName=com.mysql.jdbc.Driver
     2 url=jdbc:mysql://127.0.0.1:3306/bookstore
     3 username=root
     4 password=root
     5 # 初始化连接数量
     6 initialSize=5
     7 # 最大连接数
     8 maxActive=10
     9 # 延迟时间
    10 maxWait=3000

      4、Druid 连接池的工具类

        可以将数据库连接池封装成一个工具类,这样在获取的连接的时候,直接拿来用即可,不用再创建连接池,更加方便。

     1 import com.alibaba.druid.pool.DruidDataSourceFactory;
     2 
     3 import javax.sql.DataSource;
     4 import java.io.IOException;
     5 import java.sql.Connection;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 import java.util.Properties;
    10 
    11 /**
    12  * Druid 连接池的工具类
    13  */
    14 public class JDBCUtils {
    15 
    16     // 1.定义成员变量
    17     private static DataSource ds;
    18 
    19     static {
    20         //加载配置文件
    21         Properties pro = new Properties();
    22         try {
    23             pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
    24             // 2 获取datasource
    25             ds = DruidDataSourceFactory.createDataSource(pro);
    26         } catch (IOException e) {
    27             e.printStackTrace();
    28         } catch (Exception e) {
    29             e.printStackTrace();
    30         }
    31 
    32     }
    33 
    34     /**
    35      * 获取连接
    36      */
    37     public static Connection getConnection() throws SQLException {
    38         return ds.getConnection();
    39     }
    40 
    41     /**
    42      * 释放资源
    43      */
    44     public static void close(Statement stmt, Connection conn) {
    45         if (stmt != null) {
    46             try {
    47                 stmt.close();
    48             } catch (SQLException e) {
    49                 e.printStackTrace();
    50             }
    51         }
    52         if (conn != null) {
    53             try {
    54                 stmt.close();
    55             } catch (SQLException e) {
    56                 e.printStackTrace();
    57             }
    58         }
    59     }
    60 
    61     public static void close(ResultSet rs, Statement stmt, Connection conn) {
    62         if (rs != null) {
    63             try {
    64                 rs.close();
    65             } catch (SQLException e) {
    66                 e.printStackTrace();
    67             }
    68         }
    69         if (stmt != null) {
    70             try {
    71                 stmt.close();
    72             } catch (SQLException e) {
    73                 e.printStackTrace();
    74             }
    75         }
    76         if (conn != null) {
    77             try {
    78                 conn.close();
    79             } catch (SQLException e) {
    80                 e.printStackTrace();
    81             }
    82         }
    83     }
    84 
    85     /**
    86      * 获取连接池方法
    87      */
    88     public static DataSource getDataSource() {
    89         return ds;
    90     }
    91 }
  • 相关阅读:
    【PKUWC2018】Minimax
    Codeforces Round #673
    【BZOJ1901】Dynamic Rankings
    【笔记】树状数组
    【CF1420E】Battle Lemmings
    Codeforces Round #672
    Problem A: STL——灵活的线性表
    algorithm
    iterator
    TRY vector
  • 原文地址:https://www.cnblogs.com/niujifei/p/11611380.html
Copyright © 2020-2023  润新知