Druid连接池(由阿里开发)
- Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。它有如下几个特点:
- 亚秒级查询
- 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的工作情况。
- 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息;
- SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0~1毫秒区间50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况;
- 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、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(); } } }