Druid连接池

Druid连接池(由阿里开发)

  • Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。它有如下几个特点:
    1. 亚秒级查询
    • druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
      2. 实时数据注入
    • druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
      3. 可扩展的PB级存储
    • druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性
      4. 多环境部署
    • druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等
      5. 丰富的社区
    • druid拥有丰富的社区,供大家学习

功能全面的Druid

  • 近几年,阿里在开源项目上动作频频,除了有像fastJson、dubbo这类项目,更有像AliSQL这类的大型软件,今天说的Druid,就是阿里众多优秀开源项目中的一个。它除了提供性能卓越的连接池功能外,还集成了SQL监控,黑名单拦截等功能,用它自己的话说,Druid是“为监控而生”。借助于阿里这个平台的号召力,产品一经发布就赢得了大批用户的拥趸,从用户使用的反馈来看,Druid也确实没让用户失望。
  • 相较于其他产品,Druid另一个比较大的优势,就是中文文档比较全面(毕竟是国人的项目么),在github的wiki页面,列举了日常使用中可能遇到的问题,对一个新用户来讲,上面提供的内容已经足够指导它完成产品的配置和使用了。

Druid 相对于其他数据库连接池的优点

  • 强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况。
    1. 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息;
    2. SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0~1毫秒区间50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况;
    3. 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等。
  • 方便扩展。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。
  • Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。

Druid使用步骤

导入jar包

  • (1)druid-1.1.5.jar
  • (2)mysql驱动包
  • 配置文件 database.properties:
 #连接设置
 driverClassName=com.mysql.jdbc.Driver
 url=jdbc:mysql://localhost:3306/xxx
 username=root
 password=root
 #<!-- 初始化连接 -->
 initialSize=10
 #最大连接数量
 maxActive=50
 #<!-- 最小空闲连接 -->
 minIdle=5
 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
 maxWait=5000
  • 编写工具类(DbUtils_Druid)
  • 代码示例:
public class DbUtils_Druid {
   private static DruidDataSource dataSource;
   static{
       try {
//         使用硬编码形式
//        dataSource = new DruidDataSource();
//            四个基本属性
//            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//            dataSource.setUrl("jdbc:mysql://localhost:3306/xxx?useSSL=true&characterEncoding=utf8");
//            dataSource.setUsername("root");
//            dataSource.setPassword("root");
//            //其他属性
//            //1初始大小
//             dataSource.setInitialSize(20);
//            //2最大大小
//             dataSource.setMaxActive(50);
//            //3最小空闲
//             dataSource.setMinIdle(10);
//            //4设置超时时间
//             dataSource.setMaxWait(5000);
           Properties properties = new Properties();//实例化配置对象
           InputStream resourceAsStream = DruidUtil.class.getClassLoader().getResourceAsStream("database.properties");
           properties.load(resourceAsStream);//加载配置文件内容
           resourceAsStream.close();
           dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
       } catch (Exception e) {
           e.printStackTrace();
       }

   }
  //获取连接对象
   public static Connection getConnection(){
       try {
           return dataSource.getConnection();
       } catch (SQLException e) {
           e.printStackTrace();
       }
       return null;
   }
}
  • 测试代码:
public class Test {
	public static void main(String[] args) throws Exception {
		for(int i=0;i<100;i++) {
			Connection connection=DbUtils.getConnection();
			if(connection!=null) {
				System.out.println("连接成功"+i+"..."+connection.hashCode()+connection.toString());
			}
			connection.close();
		}
	}
}

参考


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦