Spring+SpringMVC+MyBatis+easyUI整合优化篇(十)数据层优化-整合druid
druid介绍
这是druid对自己的介绍:
Druid是阿里开源的一个数据库连接池技术,号称自己是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。至于为什么它态度这么屌,是因为Druid确实有这个实力,Druid是在目前java技术市场中流行的连接池技术的基础上开发出来的,DBCP、C3P0这些连接池技术包含的功能Druid都有,而且它也不仅仅只是一个连接池,Druid是一个强大的JDBC组件,它包括三部分:
- DruidDriver,能够提供基于Filter-Chain模式的插件体系。
- DruidDataSourc,高效可管理的数据库连接池。
- SQLParser。
Druid在原来连接池技术的基础上又添加了一些使用功能,可以说是青出于蓝而胜于蓝了,同时他自身的插件体系也使得Druid具有很好的扩展性,最关键的是,Druid依然是github上较为活跃的开源项目,版本更新也比较频繁,这一点是我个人感觉最加分的。介绍文字就到这里,本篇文章是介绍整合代码的。
druid整合
更新代码已上传到我的github里,地址点这里
首先是更新pom文件,添加druid依赖
<!-- Start: druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<!-- 版本号你自己选 -->
<version>1.0.24</version>
</dependency>
<!-- End: druid -->
更新后的数据源配置文件及参数解释:
<!-- 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${druid.initialSize}"/>
<property name="minIdle" value="${druid.minIdle}"/>
<property name="maxActive" value="${druid.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${druid.maxWait}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
<!--用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。-->
<property name="validationQuery" value="${druid.validationQuery}" />
<!--申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。-->
<property name="testWhileIdle" value="${druid.testWhileIdle}" />
<!-- 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 -->
<property name="testOnBorrow" value="${druid.testOnBorrow}" />
<!-- 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能-->
<property name="testOnReturn" value="${druid.testOnReturn}" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。-->
<property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="${druid.maxPoolPreparedStatementPerConnectionSize}" />
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="${druid.filters}" />
</bean>
配置文件分离
在做Druid整合的时候,感觉原来的配置文件比较乱,每次有一点更新都要去修改applicationContext.xml文件,而且applicationContext.xml文件又比较大,内容多的情况下改起配置来确实痛苦,因此就借着这次整合Druid连接池,把配置文件重新整理了一下。
原applicationContext.xml文件拆分为spring-context.xml,spring-context-mvc.xml,spring-context-mybatis.xml,jdbc-druid-config.properties文件,然后修改web.xml文件即可。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context.xml</param-value>
</context-param>
...
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context-mvc.xml</param-value>
</init-param>
<!--加载顺序为1 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
分离之后,明显赶紧结构化清晰很多,相关的配置很清楚在哪一个模块,之后需要整合加入配置也很简单清楚,需要指出的是,每个配置文件的命名及里面的配置内容都要写清楚,不要一股脑全部复制粘贴,用到什么写什么,尽可能的简化和规范配置文件,让配置文件看的明白。
总结
本篇文章介绍了整合过程,同时也对Druid参数做了详细的解释,如果想继续深入了解可以去github上的druid仓库学习代码,druid仓库在这里。
本来只是想更新整合Druid模块代码的,但是过程中看到配置文件混乱,确实忍不了,于是也顺手做了修改,虽然只是做了一点事情,但是代码文件看着舒服也是极好的,接下来的文章里可能还会继续更新druid,看时间安排吧。
常见问题
欢迎大家使用Druid,常见问题在这里解答,希望对大家有所帮助。
1. Druid是什么?
Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。
2. 在哪里下载druid
- 正式版本下载:
maven中央仓库: http://central.maven.org/maven2/com/alibaba/druid/
3. 怎么获取Druid的源码
Druid是一个开源项目,源码托管在github上,源代码仓库地址是 https://github.com/alibaba/druid 。同时每次Druid发布正式版本和快照的时候,都会把源码打包,你可以从上面的下载地址中找到相关版本的源码
4. 怎么配置maven
Druid 0.1.18 之后版本都发布到maven中央仓库中,所以你只需要在项目的pom.xml中加上dependency就可以了。例如:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
也可以选择 Maven仓库查找公共的仓库地址: http://www.mvnrepository.com/artifact/com.alibaba/druid
5. 怎么打开Druid的监控统计功能
Druid的监控统计功能是通过filter-chain扩展实现,如果你要打开监控统计功能,配置StatFilter,具体看这里:https://github.com/alibaba/druid/wiki/配置_StatFilter
6. 怎样使用Druid的内置监控页面
内置监控页面是一个Servlet,具体配置看这里:
https://github.com/alibaba/druid/wiki/配置_StatViewServlet配置
7. 内置监控中的Web和Spring关联监控怎么配置?
- Web关联监控配置
https://github.com/alibaba/druid/wiki/配置_配置WebStatFilter - Spring关联监控配置
https://github.com/alibaba/druid/wiki/配置_Druid和Spring关联监控配置
8. 怎么配置防御SQL注入攻击
Druid提供了WallFilter,它是基于SQL语义分析来实现防御SQL注入攻击的。具体配置看这里:
https://github.com/alibaba/druid/wiki/配置-wallfilter
9. Druid有没有参考配置
不同的业务场景需求不同,你可以使用我们的参考配置,但建议你仔细阅读相关文档,了解清楚之后做定制配置。
https://github.com/alibaba/druid/wiki/配置_DruidDataSource参考配置
10. 我想日志记录JDBC执行的SQL,如何配置
Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter,具体配置看这里
https://github.com/alibaba/druid/wiki/配置_LogFilter
11. 我的程序可能产生连接泄漏了,有什么办法?
Druid提供了多种监测连接泄漏的手段,具体看这里:
https://github.com/alibaba/druid/wiki/连接泄漏监测
12. 在Druid中使用PSCache会有内存占用过大问题么?
连接Oracle数据库,打开PSCache,在其他的数据库连接池都会存在内存占用过多的问题,Druid是唯一解决这个问题的连接池。具体看这里:
https://github.com/alibaba/druid/wiki/Oracle数据库下PreparedStatementCache内存问题解决方案
13. 有没有和其他数据库连接池的对比?
14. 从其他连接池迁移要注意什么?
- 不同连接池的参数参照对比:
http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=6947005 - DBCP迁移 https://github.com/alibaba/druid/wiki/DBCP迁移
15. Druid中有没有类似Jboss DataSource中的ExceptionSorter
ExceptionSorter是JBoss DataSource中的优秀特性,Druid也有一样功能的ExceptionSorter,但不用手动配置,自动识别生效的。具体看这里:https://github.com/alibaba/druid/wiki/ExceptionSorter_cn
16. Druid中的maxIdle为什么是没用的?
maxIdle是Druid为了方便DBCP用户迁移而增加的,maxIdle是一个混乱的概念。连接池只应该有maxPoolSize和minPoolSize,druid只保留了maxActive和minIdle,分别相当于maxPoolSize和minPoolSize。
17. 我的应用配置的是JNDI数据源,可以用DruidDataSource么?
DruidDataSource支持JNDI配置,具体看这里:https://github.com/alibaba/druid/wiki/配置_JNDI_Tomcat
具体实现的类是这个:com.alibaba.druid.pool.DruidDataSourceFactory,你可以阅读代码加深理解。
18. 我的应用已使用DBCP,是代码中写死的,怎样更换为Druid?
可以的,Druid提供了一个中完全平滑迁移DBCP的办法。
-
- 从http://repo1.maven.org/maven2/com/alibaba/druid/druid-wrapper/ 下载druid-wrapper-xxx.jar
- 从http://repo1.maven.org/maven2/com/alibaba/druid/druid-wrapper/ 下载druid-wrapper-xxx.jar
-
- 加入druid-xxx.jar
- 加入druid-xxx.jar
-
- 从你的WEB-INF/lib/中删除dbcp-xxx.jar
- 从你的WEB-INF/lib/中删除dbcp-xxx.jar
-
- 按需要加上配置,比如JVM启动参数加上-Ddruid.filters=stat,动态配置druid的filters
- 按需要加上配置,比如JVM启动参数加上-Ddruid.filters=stat,动态配置druid的filters
这种用法,使得可以在一些非自己开发的应用中使用Druid,例如在sonar中部署druid,sonar是一个使用jruby开发的web应用,写死了DBCP,只能够通过这种方法来更换。
19. 我想试用快照版本,怎么获取?
直接获取快照版本的地址是:http://code.alibabatech.com/mvn/snapshots/com/alibaba/druid/ ,使用快照版本建议加入我们QQ群 92748305,遇到问题直接反馈给我们。
20. 有一些SQL执行很慢,我希望日志记录下来,怎么设置?
在StatFilter配置中有慢SQL执行日志记录,看这里 https://github.com/alibaba/druid/wiki/配置_StatFilter
21. 我希望加密我的数据库密码怎么办?
运维和DBA都不希望把密码明文直接写在配置文件中,Druid提供了数据库秘密加密的功能。具体看这里:
https://github.com/alibaba/druid/wiki/使用ConfigFilter
22. 如何参与Druid的开发
Druid是一个通过github开源的项目,github的特性,使得你很容易参与其中。这里有详细说明
https://github.com/alibaba/druid/wiki/如何参与
23. Druid的发布周期是怎样?
Druid是一个活跃的项目,长期维护。每个月有一个发布窗口,除非遇到重大bug和非常紧急的需求,否则都是每个月最多发布一次。如果没有足够多的需求,发布窗口就不会被使用。
24. 如果DruidDataSource在init的时候失败了,不再使用,是否需要close
是的,如果DruidDataSource不再使用,必须调用close来释放资源,释放的资源包括关闭Create和Destory线程。
26. Oracle下jdbc executeBatch时,更新行数计算不正确
使用jdbc的executeBatch 方法,如果数据库为oracle,则无论是否成功更新到数据,返回值都是-2,而不是真正被sql更新到的记录数,这是Oracle JDBC Driver的问题,Druid不作特殊处理。
28. 如何保存监控记录
https://github.com/alibaba/druid/wiki/怎么保存Druid的监控记录
29. 我想Log输出SQL执行的信息怎么办?
https://github.com/alibaba/druid/wiki/配置_LogFilter
30. 如何配置Druid内置的log实现
第一次,当它本可进取时,却故作谦卑;
第二次,当它空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中虽不甘心,却又畏首畏尾。