从零开始学 Java - 数据库连接池的选择 Druid
我先说说数据库连接
数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名、密码了,然后我们就可以打开门去任意的存取东西了。这个时候,我们与数据库之间的连接就是「数据库连接」。
这个时候问题就来了,当我们仅仅只需要去取一个东西的时候,我们取完东西随手关上门,然后拔出钥匙,这完全是再正常不过的流程了,完全没毛病,但是,我们大部分时间是需要一件件的把仓库中的东西搬到外面停放的大卡车上,那这时候我们如果取一件东西把门锁上,然后再打开门取一件再次锁上,这有没有毛病?在我看来,这个逻辑完全正确,没一点毛病,就是这样必然会影响我们装货的效率嘛!正常人肯定会想到我们不锁门不就行了,等这批货装完了,我们再锁上门。这可以阿,但是,会不会有安全及其他问题?还有这时候你是否允许别人从你打开的门进入仓库搬东西?
如果,这时候我们招聘了一个「仓库管理员」帮忙我们管理会怎样?当然完美啦,他会在你进入仓库时给你「授权令」进入,然后可能还会在你出来的时候检查下你搬的货物是否正确,并做下记录以及报表分析,然后你完成时把你的「授权令」还给他,另外一个人进入当然也是这样的,也并不会影响到你的工作,你俩当然可以同时搬东西,仓库管理员并不会在你结束的时候锁上门。
何为数据库连接池
其实上面的「仓库管理员」我就认为是我们程序世界的数据库连接池。因为他手里拿着大把的进入仓库的令牌,他给你一个你就能进去,出来后你还给他,他再接着可以给下一个人,这个时候我们仓库门是一直打开的状态,省去了大把我们开锁、开门、关门、锁门的操作,完全交由一个专业人士管理,更神奇的是他还能记录你的一系列操作。
看概念:
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
摘自百度百科
在大部分 .Net 开发人心目中,好像并没有数据库连接池的概念,只有数据库连接,然后用完要记得close和用using,在 Java 中有太多的开源的数据库连接池,而且好像一个吹的比一个厉害。我其实告诉你,其实在 .Net 中 ADO.Net 已经帮我们实现了数据库连接池,我们并不需要什么配置,用就是了,但 Java 不一样,需要我们自己选择合适的数据库连接池。下面我说说项目中为什么选择了阿里的 Druid 数据库连接池。
为监控而生的数据库连接池
这是它在 GitHub 上的描述,它有四千多的 Star , 这些并不重要,其实他的监控功能做的很不错,对开发完成后我们代码优化提供了大量的参考,至少在数据库连接层面的提升是明显可见的。我们曾经把一个耗时半分钟的查询优化到毫秒级别,当然这并不是全靠优化数据库查询,但它对调优有重要帮助。
网上有很多各个比较常用的连接池的对比,如 c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool 等等这些,你可以搜到详细的对比,我这里不再讨论,我提供一个 连接池c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool对比测试,可以参考。下面是官方的功能对比:

这些内容你都可以在 GitHub(https://github.com/alibaba/druid/)上找到。
配置起来也很简单
一、下载druid-1.0.9.jar导入到项目
这一步你就去下载就行了,地址:http://central.maven.org/maven2/com/alibaba/druid/1.0.9/druid-1.0.9.jar
二、applicationContext.xml文件配置数据库连接
这好像和其他数据库连接池没多少区别,除了几个参数不同而已,我贴出我的配置
<!--master 配置数据源 -->
<bean id="masterDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/springdemo?useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123456</value>
</property>
<!-- 通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall -->
<property name="filters" value="stat,log4j" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="30" />
<!-- 初始化连接数量 -->
<property name="initialSize" value="5" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="5" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="poolPreparedStatements" value="false" />
<property name="maxOpenPreparedStatements" value="100" />
<!-- 打开removeAbandoned功能(连接泄漏监测,怀疑存在泄漏之后再打开) -->
<property name="removeAbandoned" value="true" />
<!-- 1800秒,也就是30分钟 -->
<property name="removeAbandonedTimeout" value="1800" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />
</bean>
上面的参数都可以根据自己的需要来调整。具体配置请访问我的 GitHub 示例https://github.com/mafly/SpringDemo/blob/master/WebContent/WEB-INF/applicationContext.xml
三、web.xml文件配置监控平台
<!-- 连接池 启用Web监控统计功能 start-->
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*mp3,*.swf,*.xls,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
<!-- 连接池 启用Web监控统计功能 end-->
在文件中加入上面配置,就可以在项目地址后加druid后访问监控平台,看一下数据库连接及 SQL 语句执行时间,当然登录密码什么的自己配置啦。登录后界面:

总结一下
我这里当然就是抛砖引玉的简单说了一下 Druid 数据库连接池的基本配置,更多强大功能等待大家去体验,在我们时间项目中,使用起来会比原来 c3p0 要爽,这里要感谢项目组中小慷同学的技术分享, Druid 的具体情况及各种配置大家都可以去 https://github.com/alibaba/druid/ 查看,文档还是比较详细的。
当然,我上面的配置大家也都可以访问我 GitHub(改版了,你去看看)上的 Spring 示例项目查看:https://github.com/mafly/SpringDemo/。
从零开始学 Java - 数据库连接池的选择 Druid的更多相关文章
- 数据库连接池的选择 Druid
我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了. ...
- 从零开始学 Java - 我放弃了 .NET ?
这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...
- 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.BoneCP.Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDB ...
- 从零开始学 Java - Spring 一主多从、多主多从 数据库配置
待会苹果要开发布会 我写完这篇文章就准备去看发布会了,因为我买了好几包瓜子和啤酒.由于苹果的保密做的越来越差劲,该曝光的信息差不多全部曝光了,我们这种熬夜看发布会的只不过是让这些信息更加真实,或者说是 ...
- 从零开始学 Java - 搭建 Spring MVC 框架
没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)
Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)
你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)
从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...
随机推荐
- 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选
在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...
- Mac安装Bower
1.安装bower,得首先安装node: brew install npm //npm是nodejs的程序包管理器,如果安装过nodejs,可忽略此步. 2.安装Git(因为需要从Git仓库获取一些代 ...
- vSphere Client 编辑虚拟机属性的问题
编辑虚拟机属性的时候, 出现: vpxclient.vmconfig.cpuid 初始值设置异常之类的,重置了, 并将注册表中的所有vmvare 相关键值删除了, 还是一样的.. 后面参照https: ...
- DataTable转Entity(Emit版)
public static List<T> ToList<T>(DataTable dt) { List<T> list = n ...
- 详解CSS的相对定位和绝对定位
CSS的相对定位和绝对定位通常情况下,我们元素的position属性的值默认为static 就是没有定位,元素出现在正常的文档流中,,这个时候你给这个元素设置的left,right,bottom,to ...
- 了解Package Configurations
使用VS2010创建的SSIS Project有两种deployment model:project deployment 和 package deployment,默认是Project deploy ...
- .NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一)
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下FluentValidation验证组件.那里只是概述了一下,并没有对其使用和强大功能做深入研究 ...
- 创建外网 ext_net - 每天5分钟玩转 OpenStack(104)
虽然外部网络是已经存在的网络,但我们还是需要在 Neutron 中定义外部网络的对象,这样 router 才知道如何将租户网络和外部网络连接起来. 上一节我们已经为创建外部网络配置了ML2,本节将通过 ...
- 【CSS进阶】box-shadow 与 filter:drop-shadow 详解及奇技淫巧
box-shadow 在前端的 CSS 编写工作想必十分常见.但是 box-shadow 除去它的常规用法,其实还存在许多不为人知的奇技淫巧. 喜欢 markdown 版本的可以戳这里. box-sh ...
- MVC中处理表单提交的方式(使用html扩展方法+juqery插件)
这里使用扩展方法来扩展基于jquery.form 插件,实现基于异步的ajax的提交方式.