常见的数据库连接池有c3p0、dbcp、druid(阿里巴巴开源,结合前面两者优点,加入日志监控,目前最好用的数据库连接池)

自定义数据库连接池

ConnectionPool.java

package test.testCoonPool;import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Properties;public class ConnectionPool {private static ConnectionPool pool;private static String driverClass;private static String url;private static String username;private static String password;//初始连接数private static int initCount = 5;//最小连接数private static int minCount = 5;//最大连接数private static int maxCount;//当前连接数private static int currentCount;//使用集合存储连接LinkedList<Connection> conns = new LinkedList<>();//成员属性初始化static {Properties properties = new Properties();try {properties.load(ConnectionPool.class.getClassLoader().getResourceAsStream("db.properties"));url = properties.getProperty("jdbc.url");username = properties.getProperty("jdbc.username");password = properties.getProperty("jdbc.password");driverClass = properties.getProperty("jdbc.driverClass");try{initCount = new Integer(properties.getProperty("jdbc.initCount"));}catch (NumberFormatException e){System.out.println("initCount使用默认值");}try{minCount = new Integer(properties.getProperty("jdbc.minCount"));}catch (NumberFormatException e){System.out.println("minCount使用默认值");}try{maxCount = new Integer(properties.getProperty("jdbc.maxCount"));}catch (NumberFormatException e){System.out.println("maxCount使用默认值");}} catch (IOException e) {e.printStackTrace();}}private ConnectionPool(){}public static ConnectionPool getPool(){if(pool==null){pool = new ConnectionPool();}return pool;}/*** 初始化数据库连接池*/private void init(){for (int i = 0; i <initCount ; i++) {boolean flag = conns.add(createConn());if(flag){currentCount++;}}System.out.println("数据库连接池初始化完成");getCurrentCount();}private Connection createConn(){try{Class.forName(driverClass);return DriverManager.getConnection(url,username,password);}catch (Exception e){throw new RuntimeException("数据库连接创建失败,"+e.getMessage());}}/*** 从池中获取一个可用连接*/public Connection getConn(){if(conns.size()>0){return conns.removeFirst();}else if(currentCount <maxCount){autoAdd();//递归调用返回连接return getConn();}else {//如果池中连接数已经达到上限,就不能扩充连接数了,就等一会(等有空闲连接)再获取try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return getConn();}}/*** 数据库连接池连接数量自增长2 ,池中没有空闲连接时调用*/private void autoAdd(){if(currentCount == maxCount){throw new RuntimeException("数据库连接池连接数量已经达到最大值!");}for (int i = 0; i <2 ; i++) {if(currentCount == maxCount){break;}conns.add(createConn());currentCount++;}}public int getCurrentCount(){System.out.println("当前数据库连接池数量:"+currentCount);return currentCount;}/*** 连接池自动缩减*/private synchronized void reduce(){//当连接数量大于最小连接数量,并且池中有空闲连接if(currentCount > minCount && conns.size()>0){try{//从池中获取连接并关闭Connection con = conns.removeFirst();con.close();con = null;currentCount--;}catch (SQLException e){}}}public void returnCon(Connection conn){conns.add(conn);reduce();}public static void main(String[] args) {ConnectionPool.getPool().init();}
}

配置文件db.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
jdbc.username=xxx
jdbc.password=xxxxxx
jdbc.initCount=8
jdbc.minCount=8
jdbc.maxCount=20

自定义数据库连接池的使用
JDBCTool.java

package test.testCoonPool;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCTool {/*** 从数据库连接池中获取连接* @return*/public static Connection getConn(){return ConnectionPool.getPool().getConn();}public static void closeAll(Statement st, ResultSet rs,Connection conn){try {if(st!=null)st.close();if(rs!=null)rs.close();if(conn!=null)ConnectionPool.getPool().returnCon(conn);} catch (SQLException e) {e.printStackTrace();}}
}

druid的使用

  • maven项目引入依赖
        <!-- 阿里巴巴druid数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.18</version></dependency>

介绍一个概念,数据源对象——jva.sql.DataSource接口对象,表示数据源对象,可以直接理解为数据库连接池,所有的连接池都会有一个数据源实现这个接口。

Druid实现这个数据源的类是:DruidDataSource

druid.properties

jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
username=xxx
password=xxxxxx
initialSize=5
maxActive=15
minIdle=5
maxWait=3000

JDBCTool2

package test.testCoonPool;import com.alibaba.druid.pool.DruidDataSource;
import javax.sql.DataSource;import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;public class JDBCTool2 {private static DataSource dataSource;static {//需要加载配置try {Properties properties = new Properties();properties.load(JDBCTool2.class.getClassLoader().getResourceAsStream("druid.properties"));dataSource = new DruidDataSource();DruidDataSource druidDataSource = (DruidDataSource)dataSource;druidDataSource.setUrl(properties.getProperty("jdbcUrl"));druidDataSource.setUsername(properties.getProperty("username"));druidDataSource.setPassword(properties.getProperty("password"));druidDataSource.setInitialSize(new Integer(properties.getProperty("initialSize")));druidDataSource.setMaxActive(new Integer(properties.getProperty("maxActive")));druidDataSource.setMaxActive(new Integer(properties.getProperty("maxActive")));druidDataSource.setMinIdle(new Integer(properties.getProperty("minIdle")));druidDataSource.setMaxWait(new Long(properties.getProperty("maxWait")));dataSource = druidDataSource;} catch (IOException e) {e.printStackTrace();throw new RuntimeException("创建druid连接池失败:"+e.getMessage());}}public  static Connection getCoon() {try {return dataSource.getConnection();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException("获取连接失败:" + e.getMessage());}}public static void closeAll(Statement st, ResultSet rs, Connection conn){try {if(st!=null)st.close();if(rs!=null)rs.close();//使用Druid获取的连接直接关闭即可,它会自己还回池中if(conn!=null)conn.close();} catch (SQLException e) {e.printStackTrace();}}
}

谈谈通过druidDataSource获取的Connection对象为什么用完后可以直接关闭,其实这是一个Connection代理对象,代理对象修改了原生对象的一些方法,特别是close方法。
代理Connection的close方法实际操作是:首先判断池中是否有过多的空闲连接,如果超过了最大空闲连接数,close会直接关闭,并且将这个连接从池中移除。如果池中的空闲连接数并不大于最大空闲连接数量,就不会关闭连接,而是标记为空闲状态。

自定义数据库连接池和Druid介绍相关推荐

  1. 数据库连接池(Druid(德鲁伊))

    JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤 在主程序(如servlet.beans)中建立数据库连接 进行sql操作 断开数据库连接   这种模式开发 ...

  2. 数据库连接池 ( 五 ) Druid 数据监控

    4.Druid 数据监控 4.0.Druid 监控参数 参数 值 含义 ActiveCount 0 当前连接池中活跃连接数 ActivePeak 1 连接池中活跃连接数峰值 ActivePeakTim ...

  3. SpringBoot 整合 数据库连接池(Druid、HicariCP、C3P0等等)

    作者:大三的土狗 专栏:SpringBoot入门到精通 快速导航 前言 1.连接池介绍 2.HicariCP 1)导入坐标 2)修改配置 3)优势 3.Druid 1)导入坐标 2)修改配置 3)优势 ...

  4. 数据库连接池 ( 四 ) Druid 连接池

    3.2.Druid 连接池 Druid:Druid不仅是一个数据库连接池,还包含一个ProxyDriver.一系列内置的JDBC组件库.一个SQL Parser. 支持所有JDBC兼容的数据库,包括O ...

  5. 数据库连接池及Druid使用步骤

    目录 一.数据库连接池简介 二.数据库连接池实现 三.Driud使用步骤 一.数据库连接池简介 数据库连接池是一个容器,负责分配,管理数据库连接(Connection),它允许应用程序重复使用一个现有 ...

  6. SpringBoot2数据库连接池自动装配原理,以及如何配置使用其他的数据库连接池(druid)为例

    SpringBoot2数据库连接池自动装配原理 一.SpringBoot的数据库连接池的相关默认 二.SpringBoot默认的数据库连接池,以及自动装配原理 三.使用其他的数据库连接池:例如Drui ...

  7. 数据库连接池C3P0详细介绍

    数据库连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的 ...

  8. java:自定义数据库连接池

    http://idata.blog.51cto.com/4581576/1159243 转载于:https://www.cnblogs.com/fengjian/archive/2013/03/22/ ...

  9. Java数据库连接池知识汇总(C3P0+DBCP+Druid)

    为什么要使用数据库连接池技术? 数据库连接池技术的优点 1. 资源重用 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性 ...

  10. Druid数据库连接池监控的使用

    Druid数据库连接池 1. Druid是什么? Druid是Java语言中最好的数据库连接池,由阿里巴巴团队开发.Druid能够提供强大的监控和扩展功能.         github地址为http ...

最新文章

  1. (转)软件测试的分类软件测试生命周期
  2. linux环境变量查询设置及保存
  3. JavaScript 获取服务器端checkBoxlist控件选中的值
  4. 又一轮电邮中间人攻击来袭 企业如何自保?
  5. SQL/T-SQL/PLSQL
  6. 如何在客户端调用服务端代码
  7. 好好的活,简简单单过!
  8. css 商城 两列_css大法之使用伪元素实现超实用的图标库(附源码
  9. USB3.1与Type-C有什么区别
  10. 用python写一个程序来验证每个数字的生成概率是否相同_Python实现简单生成验证码功能【基于random模块】...
  11. 编写一个程序,从10亿个数字的数组中找出100个最大的数字
  12. JeffreyLynny版面,开版第一篇!!!
  13. 解决 spring cloud git config 配置中心多环境问题
  14. 模组管理器功能模块热插拔流程
  15. 三相对称电力系统中的正序、负序、零序分量
  16. linux系统tcl电视刷机包,tcl电视刷机包tcl电视升级包系统修复tcl电视强刷包
  17. security基于数据库的认证(二)
  18. 哟西,张家界三日自助游走起@-@
  19. C/C++实现文件加密器
  20. EMC PowerPath

热门文章

  1. 交换机 VLAN配置基础及实例
  2. DotNET的GNU版开源实现DotGNU
  3. max/sup、min/inf辨析
  4. 微信扫码访问网站调用默认浏览器打开如何实现?
  5. Swift 扩展 Storyboard 属性
  6. 深入了解基于容器的红帽PaaS和OpenShift
  7. fatal: Not a git repository (or any of the parent directories): .git的解决办法
  8. jQuery使table表格隔行显示不同颜色
  9. 可实现的python拟牛顿法的DFP算法
  10. Canvas 通过改变渐变色渐变百分比位置做飞线效果