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 Pool | 1 thread | 2 threads | 5 threads | 10 threads | 20 threads | 50threads |
---|---|---|---|---|---|---|
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:druid
和 mysql: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 浏览器显示效果如下:
数据库查询测试
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 }
· 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)