一:druid
1.Druid是一个JDBC组件,它包括三部分:
-
DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系,类似Serlvet的Filter,配置Filter拦截JDBC的方法调用,可以很方便编写JDBC层的扩展插件。可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。
-
DruidDataSource 高效可管理的数据库连接池。 替换DBCP和C3P0等其他数据库连接池
-
SQLParser mycat使用
2.作者简介-温少
2001年毕业于深圳大学,毕业后到金蝶软件研发中心工作9年,工作内容包括工作流引擎、多数据库支持引擎、短信网网关等。2010年3月加入阿里巴巴至今,主要的工作是设计和实现阿里巴巴应用监控系统Dragoon,Druid和Fastjson都是监控系统实现的副产品。
- 阿里巴巴是一个重度使用关系数据库的公司,我们在生产环境中大量的使用Druid,通过长期在极高负载的生产环境中实际使用、修改和完善,让Druid逐步发展成最好的数据库连接池。Druid在监控、可扩展性、稳定性和性能方面都有明显的优势。
- 稳定性。In Taobao large-scale high concurrency environment, only two connection pools to work very well, druid and jboss connection pool.
- 强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况 监控实例
- Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。https://github.com/alibaba/druid/wiki/%E5%90%84%E7%A7%8D%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0%E5%AF%B9%E6%AF%94
- 性能不是Druid的设计目标,但是测试数据表明,Druid性能比DBCP、C3P0、Proxool、JBoss都好。https://github.com/alibaba/druid/wiki/%E5%90%84%E7%A7%8D%E8%BF%9E%E6%8E%A5%E6%B1%A0%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94%E6%B5%8B%E8%AF%95
- 扩展性,Druid提供Filter-Chain模式的插件框架,通过编写Filter配置到DruidDataSource中就可以拦截JDBC的各种API,从而实现扩展。Druid提供了一系列内置Filter
-
防sql注入WallFilter,Druid的优势是在JDBC最低层进行拦截做判断,不会遗漏。Druid实现了Oracle、MySql、Postgresql、SQL-92的Parser,基于SQL语法分析实现,理解其中的SQL语义,智能、准确、误报率低。
- Druid是一个开源项目,基于Apache 2.0协议,你可以免费自由使用。Druid只支持JDK 6以上版本,不支持JDK 1.4和JDK 5.0
- 配置简单,为了方便大家迁移,Druid的配置和DBCP是基本一致的,如果你原来是使用DBCP,迁移是十分方便的,只需要把 corg.apache.commons.dbcp.BasicDataSource修改为 om.alibaba.druid.pool.DruidDataSource就好了。
4.注意事项
- 锁的公平和效率是一个需要平衡的问题。如果配置了maxWait,在连接不够用争用时,unfair模式的ReentrantLock.tryLock方法存在严重不公的现象,个别线程会等到超时了还获取不到连接。
- MySQL的wait_timeout默认是8小时,如果没有配置testonborrow,连接空闲超过wait_timeout后会变无效连接并且druid不会知晓。但druid默认会在连接空闲7小时后丢弃连接。如果配置过mysql的wait_timeou,则druid也要相对做配置。
- druid并不能保持最小连接数,设计如此。
- 用到sql防火墙时需要注意如果是SQLParser不能识别的sql语句,可能会报错。
- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
二:HikariCP-2.4.7学习总结和遇到的疑问
HikariCP是偶然在网上看到的,因为被称为最快的数据库连接池,所以关注、学习了下。HikariCP网上资料很少,所以我自己下了代码阅读了下,分享一些HikariCP的代码。HikariCP代码相对较少,不像druid,jar包2MB,而且代码基本没有任何注释。
1.github_HikariCP作者对于快的wiki.https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole
2.Double-checked_locking:HikariDataSource_86.http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java
3.HikariPool_171 连接是否alive
4.HikariPool_435 variance up to 2.5% of the maxlifetime
5.HikariPool_436 ThreadLocalRandom
6.ConcurrentBag_borrow 快的关键方法
7.Sequence_77 LongAdder vs AtomicLong
8.About Pool Sizing https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
9.一些相关的技术:lock-free; false-sharing ;cas;happens-before
来源:oschina
链接:https://my.oschina.net/u/2261352/blog/4821725