博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)数据库连接池的理解和使用
阅读量:4626 次
发布时间:2019-06-09

本文共 4966 字,大约阅读时间需要 16 分钟。

一、什么是数据库连接池?

官方:连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申

请,使用,释放。

个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们

集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

二、数据库连接池的运行机制

(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源

三、数据库连接池的使用

作为开源的数据库连接池,C3P0是一个优秀的连接池,性能也十分可靠。首先到http://sourceforge.net/projects/c3p0/下载相应的jar包,总共三个,

如下图所示。

其次将jar包导入到工程当中,然后就可以使用cp30了。
示例代码如下:
package com.zww.server;            import java.beans.PropertyVetoException;      import java.sql.Connection;      import java.sql.SQLException;      import com.mchange.v2.c3p0.ComboPooledDataSource;            public final class ConnectionManager {          //使用单利模式创建数据库连接池          private static ConnectionManager instance;          private static ComboPooledDataSource dataSource;                private ConnectionManager() throws SQLException, PropertyVetoException {              dataSource = new ComboPooledDataSource();                    dataSource.setUser("root");     //用户名              dataSource.setPassword("123456"); //密码              dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/zww");//数据库地址              dataSource.setDriverClass("com.mysql.jdbc.Driver");              dataSource.setInitialPoolSize(5); //初始化连接数              dataSource.setMinPoolSize(1);//最小连接数              dataSource.setMaxPoolSize(10);//最大连接数              dataSource.setMaxStatements(50);//最长等待时间              dataSource.setMaxIdleTime(60);//最大空闲时间,单位毫秒          }                public static final ConnectionManager getInstance() {              if (instance == null) {                  try {                      instance = new ConnectionManager();                  } catch (Exception e) {                      e.printStackTrace();                  }              }              return instance;          }                public synchronized final Connection getConnection() {              Connection conn = null;              try {                  conn = dataSource.getConnection();              } catch (SQLException e) {                  e.printStackTrace();              }              return conn;          }      }
下面是测试代码:
package com.zww.server;            import java.sql.Connection;      import java.sql.PreparedStatement;      import java.sql.ResultSet;      import java.sql.SQLException;            import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;                  public class ConnectionDemo {                public static void main(String[] args) throws SQLException {              System.out.println("使用连接池................................");              for (int i = 0; i < 20; i++) {                  long beginTime = System.currentTimeMillis();                  Connection conn = ConnectionManager.getInstance().getConnection();                  try {                      PreparedStatement pstmt = conn.prepareStatement("select * from event");                      ResultSet rs = pstmt.executeQuery();                      while (rs.next()) {                           // do nothing...                      }                  } catch (SQLException e) {                      e.printStackTrace();                  } finally {                      try {                          conn.close();                      } catch (SQLException e) {                          e.printStackTrace();                      }                  }                        long endTime = System.currentTimeMillis();                  System.out.println("第" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime));              }                    System.out.println("不使用连接池................................");              for (int i = 0; i < 20; i++) {                  long beginTime = System.currentTimeMillis();                  MysqlDataSource mds = new MysqlDataSource();                  mds.setURL("jdbc:mysql://localhost:3306/zww");                  mds.setUser("root");                  mds.setPassword("123456");                  Connection conn = mds.getConnection();                  try {                      PreparedStatement pstmt = conn.prepareStatement("select * from event");                      ResultSet rs = pstmt.executeQuery();                      while (rs.next()) {                                          // do nothing...                      }                  } catch (SQLException e) {                      e.printStackTrace();                  } finally {                      try {                          conn.close();                      } catch (SQLException e) {                          e.printStackTrace();                      }                  }                  long endTime = System.currentTimeMillis();                  System.out.println("第" + (i + 1) + "次执行花费时间为:"                                      + (endTime - beginTime));              }                }
运行结果如下图所示:

结果表明,在使用连接池时,只在第一次初始化时,比较耗时,完成初始化之后,使用连接池进行数据库操作明显比不使用连接池花费的时间少。

转载于:https://www.cnblogs.com/zhangmingcheng/p/7376486.html

你可能感兴趣的文章
mysql查询结果乱码
查看>>
《构建之法》读书笔记01
查看>>
不用JQuery,原生Javascript实现Ajax功能及相关知识点
查看>>
Keil MDK中的Code, RO-data , RW-data, ZI-data分别代表什么意思?(转)
查看>>
WPF listbox数据绑定
查看>>
实现鼠标移到某个对象,在旁边显示层。
查看>>
函数 加分
查看>>
Jenkins+GitLab
查看>>
C++学习笔记2——引用
查看>>
url
查看>>
[小北De编程手记] : Lesson 01 玩转 xUnit.Net 之 概述
查看>>
LeetCode "Median of Two Sorted Arrays"
查看>>
PAT 1004. Counting Leaves (30)
查看>>
首先你得承认世界上有全面超过你的人
查看>>
20165204 Java第二周学习
查看>>
php数组转xml
查看>>
Binary Tree Serialisation Lintcode
查看>>
C# LINQ学习笔记
查看>>
easyui select 下拉框的取值和赋值
查看>>
java.lang.IllegalArgumentException: Request header is too large
查看>>