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 }

 

转载于:https://www.cnblogs.com/niujifei/p/11611380.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值