zoukankan      html  css  js  c++  java
  • JDBC(二) —— 数据库连接池

    一、概述

    1. 概念

    用户从容器(数据库连接池)中获取连接,不会向系统底层申请资源。

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

    当系统初始化好后,容器被创建,容器中会申请一些连接对象 ,用户访问完之后,会将连接对象归还给容器。

    2. 好处:节约资源;用户访问高效。

    二、实现

    1. 标准接口:DataSource   javax.sql包下的

      方法:

        获取连接  getConnection()

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

      一般我们不去实现它,由数据库厂商来实现

        C3P0:数据库连接池技术

        druid:数据库连接池实现技术,由阿里巴巴提供,高效

    三、数据库连接池 —— c3p0基本使用

    1. 步骤:

      (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

     实例配置文件c3p0-config.xml

    <c3p0-config>
        <!-- 使用默认的配置读取连接池对象 -->
        <default-config>
            <!-- 连接参数 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property>
            <property name="user">root</property>
            <property name="password">root</property>
    
            <!-- 连接池参数 -->
            <property name="initialPoolSize">5</property>
            <property name="maxPoolSize">10</property>
            <property name="checkoutTimeout">3000</property>
        </default-config>
    
        <named-config name="otherc3p0">
            <!-- 连接参数 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property>
            <property name="user">root</property>
            <property name="password">root</property>
    
            <!-- 连接池参数 -->
            <property name="initialPoolSize">5</property>
            <property name="maxPoolSize">8</property>
            <property name="checkoutTimeout">1000</property>
        </named-config>
    </c3p0-config>
    实例代码
     1 package cn.itcast.datasource.c3p0;
     2 
     3 import com.mchange.v2.c3p0.ComboPooledDataSource;
     4 
     5 import java.sql.Connection;
     6 import java.sql.SQLException;
     7 
     8 import javax.sql.DataSource;
     9 
    10 /**
    11  * c3p0演示
    12  */
    13 public class C3P0Demo2 {
    14     public static void main(String[] args) throws SQLException {
    15         //1.1获取DataSource,使用默认配置
    16         //DataSource ds = new ComboPooledDataSource();
    17         //1.2获取DataSource,使用指定名称配置
    18         DataSource ds = new ComboPooledDataSource("otherc3p0");
    19         //2.获取连接
    20         for(int i = 1; i<=10; i++){
    21             Connection conn = ds.getConnection();
    22             System.out.println(i+":"+conn);
    23 
    24             if(i == 5){
    25                 conn.close();//归还连接到连接池
    26             }
    27         }
    28 
    29     }
    30 }
    四、数据库连接池——druid使用
    1. 使用步骤
      (1)导入jar包 druid-1.0.9.jar
      (2)定义配置文件
        是properties形式的
        可以叫任意名称,可以放在任意目录下(不会自动加载)
      (3)加载配置文件 Properties
      (4)获取数据库连接池对象 DataSource:通过工厂类来获取 DruidDataSourceFactory

      (4)获取连接:getConnection方法
    示例代码
    druid.properties
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/db2
    username=root
    password=root
    #初始化链接数量
    initialSize=5
    #最大连接数
    maxActive=10
    #最大等待时间
    maxWait=3000
    DruidDemo.java
     1 package cn.itcast.datasource.druid;
     2 
     3 import com.alibaba.druid.pool.DruidDataSourceFactory;
     4 
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.sql.Connection;
     8 import java.util.Properties;
     9 
    10 import javax.sql.DataSource;
    11 
    12 /**
    13  * druid演示
    14  */
    15 public class DruidDemo {
    16     public static void main(String[] args) throws Exception {
    17         //1.导入jar包
    18 
    19         //2.定义配置文件
    20 
    21         //3.加载配置文件
    22         Properties pro = new Properties();
    23         InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
    24         pro.load(is);
    25         //4.获取连接池对象
    26         DataSource ds = DruidDataSourceFactory.createDataSource(pro);
    27         //5.获取连接
    28         Connection conn = ds.getConnection();
    29         System.out.println(conn);
    30 
    31     }
    32 }
    2. 定义工具类
      (1)定义工具类 JDBCUtils
      (2)提供静态代码块加载配置对象,初始化连接池对象
      (3)提供方法:
          1)获取连接方法:通过数据库连接池获取连接
          2)释放资源
          3)获取连接池的方法

    示例代码:JDBCUtils
      1 package cn.itcast.datasource.utils;
      2 
      3 import com.alibaba.druid.pool.DruidDataSourceFactory;
      4 
      5 import java.io.IOException;
      6 import java.sql.Connection;
      7 import java.sql.ResultSet;
      8 import java.sql.SQLException;
      9 import java.sql.Statement;
     10 import java.util.Properties;
     11 
     12 import javax.sql.DataSource;
     13 
     14 /**
     15  * Druid连接池工具类
     16  */
     17 public class JDBCUtils {
     18     //1.定义一个成员变量DataSource
     19     private static DataSource ds;
     20 
     21     static{
     22 
     23         try {
     24             //1.加载配置文件
     25             Properties pro = new Properties();
     26             pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
     27             //2.获取DataSource
     28             ds = DruidDataSourceFactory.createDataSource(pro);
     29         } catch (IOException e) {
     30             e.printStackTrace();
     31         } catch (Exception e) {
     32             e.printStackTrace();
     33         }
     34     }
     35 
     36     /**
     37      * 获取连接
     38      * @return
     39      * @throws SQLException
     40      */
     41     public static Connection getConnection() throws SQLException {
     42         return ds.getConnection();
     43     }
     44 
     45     /**
     46      * 释放资源
     47      * @param stmt
     48      * @param conn
     49      */
     50     public static void close(Statement stmt, Connection conn){
     51         if(stmt != null){
     52             try {
     53                 stmt.close();
     54             } catch (SQLException e) {
     55                 e.printStackTrace();
     56             }
     57         }
     58         if(conn != null){
     59             try {
     60                 conn.close();//归还连接
     61             } catch (SQLException e) {
     62                 e.printStackTrace();
     63             }
     64         }
     65     }
     66 
     67     /**
     68      * 释放资源
     69      * @param rs
     70      * @param stmt
     71      * @param conn
     72      */
     73     public static void close(ResultSet rs, Statement stmt, Connection conn){
     74         if(rs != null){
     75             try {
     76                 rs.close();
     77             } catch (SQLException e) {
     78                 e.printStackTrace();
     79             }
     80         }
     81         if(stmt != null){
     82             try {
     83                 stmt.close();
     84             } catch (SQLException e) {
     85                 e.printStackTrace();
     86             }
     87         }
     88         if(conn != null){
     89             try {
     90                 conn.close();//归还连接
     91             } catch (SQLException e) {
     92                 e.printStackTrace();
     93             }
     94         }
     95     }
     96 
     97     public static DataSource getDataSource(){
     98         return ds;
     99     }
    100 }
    示例代码:DruidDemo2
    package cn.itcast.datasource.druid;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import cn.itcast.datasource.utils.JDBCUtils;
    
    /**
     * 使用Druid工具类
     */
    public class DruidDemo2 {
        public static void main(String[] args) {
            /**
             * 完成一个添加的操作,给account表添加一条记录
             */
            Connection conn = null;
            PreparedStatement pstmt = null;
    
            try {
                //1.获取连接
                conn = JDBCUtils.getConnection();
                //2.定SQL
                String sql = "insert into account values(null, ?, ?)";
                //3.获取pstmt对象
                pstmt = conn.prepareStatement(sql);
                //4.给?赋值
                pstmt.setString(1,"王五");
                pstmt.setDouble(2,3000);
                //5.执行SQL
                int count = pstmt.executeUpdate();
                System.out.println(count);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally{
                JDBCUtils.close(pstmt,conn);
            }
    
        }
    }











  • 相关阅读:
    WPF简单的分页控件实现
    WPF常用样式总结
    树:重建二叉树
    从尾到头打印链表
    字符串替换空格
    二维数组中的查找
    C#中转换运算符explicit、implicit、operator、volatile研究
    泛型实现常用算法
    .NET架构师知识普及
    .NET中扩展方法和Enumerable(System.Linq)
  • 原文地址:https://www.cnblogs.com/upyang/p/13493798.html
Copyright © 2011-2022 走看看