夜微凉、的博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  76 随笔 :: 24 文章 :: 22 评论 :: 24万 阅读

Druid 简介

Druid为监控而生的数据库连接池,它是阿里巴巴开源平台上的一个项目。Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能.它可以替换DBCP和C3P0连接池。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

各种连接池性能对比测试

测试执行申请归还连接 1,000,000(一百万)次总耗时性能对比。
测试环境

 

环境版本
OS OS X 10.8.2
CPU Intel i7 2GHz 4 Core
JVM Java Version 1.7.0_05

 

 

 

 

 

基准测试结果

Jdbc Connection Pool1 thread2 threads5 threads10 threads20 threads50threads
Druid 898 1,191 1,324 1,362 1,325 1,459
tomcat-jdbc 1,269 1,378 2,029 2,103 1,879 2,025
DBCP 2,324 5,055 5,446 5,471 5,524 5,415
BoneCP 3,738 3,150 3,194 5,681 11,018 23,125
jboss-datasource 4,377 2,988 3,680 3,980 32,708 37,742
C3P0 10,841 13,637 10,682 11,055 14,497 20,351
Proxool 16,337 16,187 18,310(Exception) 25,945 33,706(Exception) 39,501(Exception)

 

 

 

 

 

 

 

 

 

 

结论

_ Druid 是性能最好的数据库连接池,tomcat-jdbc 和 druid 性能接近。
_ proxool 在激烈并发时会抛异常,完全不靠谱。
_ c3p0 和 proxool 都相当慢,慢到影响 sql 执行效率的地步。
_ bonecp 性能并不优越,采用 LinkedTransferQueue 并没有能够获得性能提升。
_ 除了 bonecp,其他的在 JDK 7 上跑得比 JDK 6 上快
_ jboss-datasource 虽然稳定,但是性能很糟糕

Spring 整合 Druid

POM

在 pom.xml 文件中新增 com.alibaba:druidmysql:mysql-connector-java 依赖

复制代码
 1 <dependency>
 2     <groupId>com.alibaba</groupId>
 3     <artifactId>druid</artifactId>
 4     <version>1.1.6</version>
 5 </dependency>
 6 <dependency>
 7     <groupId>mysql</groupId>
 8     <artifactId>mysql-connector-java</artifactId>
 9     <version>5.1.46</version>
10 </dependency>
11  <dependency>
12      <groupId>org.springframework</groupId>
13      <artifactId>spring-jdbc</artifactId>
14      <version>${spring.version}</version>
15 </dependency>
复制代码

配置数据库连接

配置数据库连接 jdbc.properties ,配置代码如下:

复制代码
 1 # JDBC
 2 # MySQL 8.x: com.mysql.cj.jdbc.Driver
 3 jdbc.driverClass=com.mysql.jdbc.Driver
 4 jdbc.connectionURL=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&useSSL=false
 5 jdbc.username=root
 6 jdbc.password=123456
 7 
 8 # JDBC Pool
 9 #连接池建立时创建的初始化连接数
10 jdbc.pool.init=1
11 #连接池中最小空闲连接数
12 jdbc.pool.minIdle=3
13 #连接池中最大的活跃连接数
14 jdbc.pool.maxActive=20
15 
16 # JDBC Test
17 jdbc.testSql=SELECT 'x' FROM DUAL
复制代码

Spring 集成 Druid

创建一个名为 spring-context-druid.xml 的 Spring 配置文件,内容如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3        xmlns:context="http://www.springframework.org/schema/context"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 5 
 6     <!-- 加载配置属性文件 -->
 7     <context:property-placeholder ignore-unresolvable="true" location="classpath:jdbc.properties"/>
 8 
 9     <!-- 数据源配置, 使用 Druid 数据库连接池 -->
10     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
11         <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
12         <property name="driverClassName" value="${jdbc.driverClass}"/>
13 
14         <!-- 基本属性 url、user、password -->
15         <property name="url" value="${jdbc.connectionURL}"/>
16         <property name="username" value="${jdbc.username}"/>
17         <property name="password" value="${jdbc.password}"/>
18 
19         <!-- 配置初始化大小、最小、最大 -->
20         <property name="initialSize" value="${jdbc.pool.init}"/>
21         <property name="minIdle" value="${jdbc.pool.minIdle}"/>
22         <property name="maxActive" value="${jdbc.pool.maxActive}"/>
23 
24         <!-- 配置获取连接等待超时的时间 -->
25         <property name="maxWait" value="60000"/>
26 
27         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
28         <property name="timeBetweenEvictionRunsMillis" value="60000"/>
29 
30         <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
31         <property name="minEvictableIdleTimeMillis" value="300000"/>
32 
33         <property name="validationQuery" value="${jdbc.testSql}"/>
34         <property name="testWhileIdle" value="true"/>
35         <property name="testOnBorrow" value="false"/>
36         <property name="testOnReturn" value="false"/>
37 
38         <!-- 配置监控统计拦截的filters -->
39         <property name="filters" value="stat"/>
40     </bean>
41 
42     <!-- spring jdbc  NamedParameterJdbcTemplate -->
43     <bean id="namedjdbctemp" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
44         <constructor-arg ref="dataSource"/>
45     </bean>
46 </beans>
复制代码

配置 Druid 监控中心

Druid 提供了大量的监控数据,只需要在 web.xml 中配置一个 Servlet 就可以方便的查看这些信息。
修改 web.xml 配置文件,增加 Druid 提供的 Servlet

1 <servlet>
2     <servlet-name>DruidStatView</servlet-name>
3     <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
4 </servlet>
5 <servlet-mapping>
6     <servlet-name>DruidStatView</servlet-name>
7     <url-pattern>/druid/*</url-pattern>
8 </servlet-mapping>

 

打开浏览器,输入:http://localhost:8080/druid/index.html 浏览器显示效果如下:

 

 

Druid 监控中心

 

数据库查询测试

复制代码
 1 @Repository
 2 public class UserDaoImpl implements UserDao {
 3 
 4     @Resource
 5     NamedParameterJdbcTemplate jdbcTemplate;
 6 
 7     public User getUserByName(String userName) {
 8         String sql = "select * from t_user where username =:userName";
 9         Map<String, Object> map = new HashMap<String, Object>();
10         map.put("userName", userName);
11 
12         return jdbcTemplate.queryForObject(sql,map,new BeanPropertyRowMapper<User>(User.class));
13     }
14 }
复制代码

 

 

posted on   夜、微凉  阅读(397)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
历史上的今天:
2018-02-27 设计模式——抽象工厂模式(Abstract Factory)
点击右上角即可分享
微信分享提示