我先说说数据库连接

数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名、密码了,然后我们就可以打开门去任意的存取东西了。这个时候,我们与数据库之间的连接就是「数据库连接」。

这个时候问题就来了,当我们仅仅只需要去取一个东西的时候,我们取完东西随手关上门,然后拔出钥匙,这完全是再正常不过的流程了,完全没毛病,但是,我们大部分时间是需要一件件的把仓库中的东西搬到外面停放的大卡车上,那这时候我们如果取一件东西把门锁上,然后再打开门取一件再次锁上,这有没有毛病?在我看来,这个逻辑完全正确,没一点毛病,就是这样必然会影响我们装货的效率嘛!正常人肯定会想到我们不锁门不就行了,等这批货装完了,我们再锁上门。这可以阿,但是,会不会有安全及其他问题?还有这时候你是否允许别人从你打开的门进入仓库搬东西?

如果,这时候我们招聘了一个「仓库管理员」帮忙我们管理会怎样?当然完美啦,他会在你进入仓库时给你「授权令」进入,然后可能还会在你出来的时候检查下你搬的货物是否正确,并做下记录以及报表分析,然后你完成时把你的「授权令」还给他,另外一个人进入当然也是这样的,也并不会影响到你的工作,你俩当然可以同时搬东西,仓库管理员并不会在你结束的时候锁上门。

何为数据库连接池

其实上面的「仓库管理员」我就认为是我们程序世界的数据库连接池。因为他手里拿着大把的进入仓库的令牌,他给你一个你就能进去,出来后你还给他,他再接着可以给下一个人,这个时候我们仓库门是一直打开的状态,省去了大把我们开锁、开门、关门、锁门的操作,完全交由一个专业人士管理,更神奇的是他还能记录你的一系列操作。

看概念:

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

摘自百度百科

在大部分 .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的更多相关文章

  1. 数据库连接池的选择 Druid

    我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了. ...

  2. 从零开始学 Java - 我放弃了 .NET ?

    这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...

  3. 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)

    主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.BoneCP.Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDB ...

  4. 从零开始学 Java - Spring 一主多从、多主多从 数据库配置

    待会苹果要开发布会 我写完这篇文章就准备去看发布会了,因为我买了好几包瓜子和啤酒.由于苹果的保密做的越来越差劲,该曝光的信息差不多全部曝光了,我们这种熬夜看发布会的只不过是让这些信息更加真实,或者说是 ...

  5. 从零开始学 Java - 搭建 Spring MVC 框架

    没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...

  6. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  7. 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)

    你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...

  8. 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)

    硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...

  9. 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)

    从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...

随机推荐

  1. MySQL中的全文索引

    之前曾经发表了一篇关于SQL Server全文索引的文章.现在将MySQL全文索引的配置过程记录一下. Step1:创建Student表 CREATE TABLE `student` ( `id` I ...

  2. Atitit 查询优化器的流程attilax总结

    Atitit 查询优化器的流程attilax总结 1.1. 来理解该过程:1 1.2. 关于这些优化器的最重要原则的就是:尽可能的减少扫描范围,2 1.3. .筛选条件分析2 1.4. 二.索引优化2 ...

  3. iOS----- Crash 分析(文二)-崩溃日志组成

    iOS Crash 分析(文二)-崩溃日志组成 现在我们看一个淘宝iOS主客崩溃的例子: ### 1.进程信息 ### Incident Identifier: E4201F10-6F5F-40F9- ...

  4. [转]Linux常用命令

    系统信息arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / ...

  5. socket编程

    一.socket地址的数据类型及相关函数 socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4.IPv6.UNIX Domain Socket.然而各种网络协议的地址格式并 ...

  6. mpi4py实践

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1.概述 MPI(Message Passing Interface),消息传递接口,是一个标准化和轻便的能够运行在各种各样并行计算机上的消息传递 ...

  7. 前端学php之常量

    × 目录 [1]定义常量 [2]常量检测 [3]系统常量[4]魔术常量 前面的话 常量在javascript中并不存在,在php中却是与变量并列的重要内容.常量类似变量,但常量一旦被定义就无法更改或撤 ...

  8. 【记录】JS 生成 URL 二维码

    示例代码: <html> <head> <title>example</title> </head> <body> <sc ...

  9. C# 将PowerPoint文件转换成PDF文件

    PowerPoint的优势在于对演示文档的操作上,而用PPT查看资料,反而会很麻烦.这时候,把PPT转换成PDF格式保存,再浏览,不失为一个好办法.在日常编程中和开发软件时,我们也有这样的需要.本文旨 ...

  10. iOS 利用JSPatch 添加热补丁功能

    ios 由于苹果的审核政策,一旦上线后发现bug是件让人崩溃的事情 不过可以利用oc的runtime机制可以家用JSPatch动态的为工程打热补丁 下载地址:https://github.com/ag ...