1. Druid的简介

  Druid是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池。

2. Druid组成

•Druid是一个JDBC组件,它包括三部分:

  •1、DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。可以监控数据库访问性能

  •2、DruidDataSource 高效可管理的数据库连接池,充当数据库连接池

  •3、SQLParser ,获得SQL执行日志

3. Druid功能

  •1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。

  •2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

  •3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。

  •4) SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

  •5)扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。

4. 在maven项目中配置Druid

4.1 pom.xml中添加依赖

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.12</version>
</dependency>

4.2 web.xml添加过滤器和servlet(配置监测访问)

<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,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
<init-param>
<param-name>profileEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>principalCookieName</param-name>
<param-value>USER_COOKIE</param-value>
</init-param>
<init-param>
<param-name>principalSessionName</param-name>
<param-value>USER_SESSION</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>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>

4.3 配置数据库连接池spring datasource

    <!--数据库连接池配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close" lazy-init="false">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialSize" value="1" />
<property name="maxActive" value="50" />
<property name="maxWait" value="30000" /> <property name="filters" value="stat,wall" />
<property name="timeBetweenEvictionRunsMillis" value="3000" />
<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="true" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="20" />
</bean>

其中

 filters    属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:

  监控统计用的filter:stat

  日志用的filter:log4j

  防御sql注入的filter:wall

其它属性查具体文档。

4.4 spring 配置(关联Spring监测)

  <!-- druidSpring配置 -->
<bean id="druid-stat-interceptor"
class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
</bean>
<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
scope="prototype">
<property name="patterns">
<list>
<value>com.albertyy.seckill.service.*</value>
<value>com.albertyy.seckill.dao.*</value>
</list>
</property>
</bean> <aop:config proxy-target-class="true">
<aop:advisor advice-ref="druid-stat-interceptor"
pointcut-ref="druid-stat-pointcut" />
</aop:config>

4.5 访问监控界面

•配置好后访问 http://ip:port/projectName/druid/index.html,能够访问配置成功

4.6 可选安全的加密操作

二、dataSource配置 注意:druid 1.0.16之前

1.1jdbc.properties

  1. ## JDBC set
  2. jdbc.url=jdbc\:mysql\://localhost\:3306/edu_demo?useUnicode\=true&characterEncoding\=utf-8
  3. jdbc.username=root
  4. jdbc.password=Obsbr4gd1oVyYr+k4KQdUMNYgKMWdDibsNJTabnph+yPmxjc6tUrT1GNsPDqa9ZvTF9QvaRD86H+Zn/H+yz2jA\=\=

1.2dataSource配置

  1. <!-- 基于Druid数据库链接池的数据源配置 -->
  2. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  3. <!-- 基本属性driverClassName、 url、user、password -->
  4. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  5. <property name="url" value="${jdbc.url}" />
  6. <property name="username" value="${jdbc.username}" />
  7. <property name="password" value="${jdbc.password}" />
  8. <!-- 配置初始化大小、最小、最大 -->
  9. <!-- 通常来说,只需要修改initialSize、minIdle、maxActive -->
  10. <property name="initialSize" value="2" />
  11. <property name="minIdle" value="2" />
  12. <property name="maxActive" value="30" />
  13. <property name="testWhileIdle" value="false" />
  14. <!-- 配置获取连接等待超时的时间 -->
  15. <property name="maxWait" value="5000" />
  16. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  17. <property name="minEvictableIdleTimeMillis" value="30000" />
  18. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  19. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  20. <!-- 解密密码必须要配置的项 -->
  21. <property name="filters" value="config" />
  22. <property name="connectionProperties" value="config.decrypt=true" />
  23. </bean>

注意:druid 1.0.16及以后

2.1jdbc.properties

  1. ## JDBC set
  2. jdbc.url=jdbc\:mysql\://localhost\:3306/edu_demo?useUnicode\=true&characterEncoding\=utf-8
  3. jdbc.username=root
  4. jdbc.password=Obsbr4gd1oVyYr+k4KQdUMNYgKMWdDibsNJTabnph+yPmxjc6tUrT1GNsPDqa9ZvTF9QvaRD86H+Zn/H+yz2jA\=\=
  5. jdbc.publickey = MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKHGwq7q2RmwuRgKxBypQHw0mYu4BQZ3eMsTrdK8E6igRcxsobUC7uT0SoxIjl1WveWniCASejoQtn/BY6hVKWsCAwEAAQ==

2.2dataSource配置

  1. <!-- 基于Druid数据库链接池的数据源配置 -->
  2. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
  3. <!-- 基本属性driverClassName、 url、user、password -->
  4. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  5. <property name="url" value="${jdbc.url}" />
  6. <property name="username" value="${jdbc.username}" />
  7. <property name="password" value="${jdbc.password}" />
  8. <!-- 解密密码必须要配置的项 -->
  9. <property name="filters" value="stat,config" />
  10. <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${jdbc.publickey}" />
  11. <!-- 配置初始化大小、最小、最大 -->
  12. <!-- 通常来说,只需要修改initialSize、minIdle、maxActive -->
  13. <property name="initialSize" value="2" />
  14. <property name="minIdle" value="2" />
  15. <property name="maxActive" value="30" />
  16. <property name="testWhileIdle" value="false" />
  17. <!-- 配置获取连接等待超时的时间 -->
  18. <property name="maxWait" value="5000" />
  19. <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
  20. <property name="minEvictableIdleTimeMillis" value="30000" />
  21. <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
  22. <property name="timeBetweenEvictionRunsMillis" value="60000" />
  23. </bean>

关于Druid生成密钥和加解密的代码实例

import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException; import com.alibaba.druid.filter.config.ConfigTools; public class UtilTest { public static void main(String[] args) throws Exception {
String [] keyPair = getPublicKeyAndPrivateKey(); // 获取公钥私钥 String privateKey = keyPair[0]; //私钥
String publicKey = keyPair[1];//公钥 System.out.println("privateKey: " + privateKey);
System.out.println("publicKey: " + publicKey); String passWord = "PBANK_USER";
System.out.println("明文密码:" + passWord); String enPassWord = encrypt(privateKey, passWord);
System.out.println("加密后密码: " + enPassWord); String dePassWord = decrypt(publicKey, enPassWord);
System.out.println("解密后密码: " + dePassWord);
} public static String [] getPublicKeyAndPrivateKey() throws NoSuchAlgorithmException, NoSuchProviderException {
String [] keyPair = ConfigTools.genKeyPair(512);
return keyPair;
} /**
* 私钥加密明文密码
* @param privateKey 私钥
* @param pwd 明文密码
* @return 加密后密码
* @throws Exception
*/
public static String encrypt(String privateKey, String pwd) throws Exception {
String enPassword = ConfigTools.encrypt(privateKey, pwd);
return enPassword;
} /**
* 公钥解密
* @param publicKey 公钥
* @param enpwd 加密后的密码
* @return 解密后的密码
* @throws Exception
*/
public static String decrypt(String publicKey, String enpwd) throws Exception {
String password = ConfigTools.decrypt(publicKey, enpwd);
return password;
}
}

  

Druid + spring 配置数据库连接池的更多相关文章

  1. spring配置数据库连接池druid

    连接池原理 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象.使用完毕后,用户也并非将连 ...

  2. Spring配置-数据库连接池proxool[转]

    数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问题提出 ...

  3. spring配置数据库连接池

    1. jdbcConfig.properties文件中 jdbc.jdbcUrl=jdbc:mysql:///ssm-crudjdbc.driverClass=com.mysql.jdbc.Drive ...

  4. Spring Boot 数据库连接池 Druid

    简介 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问 ...

  5. 项目重构之数据源配置与优化:log4j 配置数据库连接池Druid,并实现日志存储到数据库

    作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...

  6. SpringBoot学习(三)-->Spring的Java配置方式之读取外部的资源配置文件并配置数据库连接池

    三.读取外部的资源配置文件并配置数据库连接池 1.读取外部的资源配置文件 通过@PropertySource可以指定读取的配置文件,通过@Value注解获取值,具体用法: @Configuration ...

  7. java配置数据库连接池的方法步骤

    java配置数据库连接池的方法步骤 java配置数据库连接池的方法步骤,需要的朋友可以参考一下   先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vecto ...

  8. Spring配置连接池

    ---------------------siwuxie095                                 Spring 配置连接池         1.Spring 配置内置连接 ...

  9. WebSphere配置数据库连接池

    通过WebSphere配置数据库连接池一共需要三项:     1.配置连接驱动,在这里叫:JDBC提供程序;    2.配置数据库连接池,在这里叫:配置数据源;  3.配置数据库登录帐号,密码,在这里 ...

随机推荐

  1. ZeroMQ+QT 字符串收发

    结合 Zeromq API函数 与 Qt 字符串QString QByteArray 实现字串收发: 发送端: zmq_msg_t msg; QString strT = “ABC汉字123”: QB ...

  2. Springboot集成Swagger操作步骤

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  3. uni-app tabBar 踩坑

    { "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages { "pa ...

  4. Vue.js---配置开发环境

    首先安装Node.js我就不介绍了! win+r , 输入cmd,回车: 1.安装淘宝镜像 在国内直接使用npm的官方镜像是比较慢的,这里我们采用的是淘宝镜像 npm install -g cnpm ...

  5. What is the !! (not not) operator in JavaScript?

    What is the !! (not not) operator in JavaScript? 解答1 Coerces强制 oObject to boolean. If it was falsey ...

  6. 对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们

    托管调试助手“CallbackOnCollectedDelegate”在“D:\XXX\XXX.vshost.exe”中检测到问题. 其他信息: 对“XXX+HookProc::Invoke”类型的已 ...

  7. form 组件如何扩展user的字段

    第一步 先将一个包引进来 第二步创建一个类加入你想要的字段

  8. leetcode 115不同的子序列

    滚动数组: /***** 下标从1开始 dp[i][j]:= numbers of subseq of S[1:j] equals T[1:i] if(s[j]==t[i]):(那么之后的子串可以是是 ...

  9. [转]maven中scope详解

    在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值: * compile,缺省值,适用于所有阶 ...

  10. React 之form表单、select、textarea、checkbox使用

    1.案例如下 import React from 'react'; /** * 非约束性组(类似defaultValue等属性,不可以程序修改): <input type="text& ...