今天是1024程序员节,先祝各位节日快乐,然后给大家一大杀技。看图。
扎心了有没有?好了,回归正题。既然要说数据连接池,那么先说明下什么是数据连续池。
在没有数据连接池的时候,所有的数据连接都是直接访问数据库的,但现在大型网站动不动数亿的点击和访问,很容易就会把数据库服务器弄宕机,而且每次连接断开需要繁琐的步骤和时间开销,容易导致资源泄露和长时间无响应等问题。
数据连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。
常见的开源JAVA数据连接池有:
C3P0:一个开放源代码的JDBC连接池,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
DBCP(DataBase connection pool): apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
但是今天我们要讲的是最好用的,那就是Alibaba Druid数据连接池。
Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。
Druid不仅仅是一个数据库连接池。Druid还是它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。
Druid扩展JDBC的一些限制,让程序员能够如向密钥服务请求凭证、统计SQL信息、SQL性能收集、SQL注入检查、SQL翻译等,还可以通过定制来实现自己需要的功能。Druid是一个开源项目,基于Apache 2.0协议,你可以免费自由使用。Druid只支持JDK 6以上版本,不支持JDK 1.4和JDK 5.0。
Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。且对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。
如果你要用java解析一个SQL语句,并实现改造,Druid是一个非常好的选择。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。 通过实验得出在解析简单SQL语句用时10微秒以内,复杂SQL用时30微秒。
通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。
从DBCP迁移最方便,把org.apache.commons.dbcp.BasicDataSource修改为om.alibaba.druid.pool.DruidDataSource就好了,从C3P0迁移也是十分方便的。
欢迎关注回复交流讨论