zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    js正则表达式中的问号使用技巧总结
    380. Insert Delete GetRandom O(1)
    34. Find First and Last Position of Element in Sorted Array
    162. Find Peak Element
    220. Contains Duplicate III
    269. Alien Dictionary
    18. 4Sum
    15. 3Sum
    224. Basic Calculator
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/niujifei/p/11611380.html
Copyright © 2011-2022 走看看