java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池。数据库连接池有很多选择,c3p、dhcp、proxool等,druid作为一名后起之秀,凭借其出色的性能,也逐渐印入了大家的眼帘。接下来本教程就说一下druid的简单使用。
首先从http://repo1.maven.org/maven2/com/alibaba/druid/ 下载最新的jar包。如果想使用最新的源码编译,可以从https://github.com/alibaba/druid 下载源码,然后使用maven命令行,或者导入到eclipse中进行编译。
1 配置
和dbcp类似,druid的配置项如下
配置 | 缺省值 | 说明 |
name | 配置这个属性的意义在于,如果存在多个数据源,监控的时候 可以通过名字来区分开来。如果没有配置,将会生成一个名字, 格式是:"DataSource-" + System.identityHashCode(this) |
|
jdbcUrl | 连接数据库的url,不同数据库不一样。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto |
|
username | 连接数据库的用户名 | |
password | 连接数据库的密码。如果你不希望密码直接写在配置文件中, 可以使用ConfigFilter。详细看这里: https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter |
|
driverClassName | 根据url自动识别 | 这一项可配可不配,如果不配置druid会根据url自动识别dbType, 然后选择相应的driverClassName |
initialSize | 0 | 初始化时建立物理连接的个数。初始化发生在显示调用init方法, 或者第一次getConnection时 |
maxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 已经不再使用,配置了也没效果 |
minIdle | 最小连接池数量 | |
maxWait | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后, 缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 |
|
poolPreparedStatements | false | 是否缓存preparedStatement,也就是PSCache。 PSCache对支持游标的数据库性能提升巨大,比如说oracle。 在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。 5.5及以上版本有PSCache,建议开启。 |
maxOpenPreparedStatements | -1 | 要启用PSCache,必须配置大于0,当大于0时, poolPreparedStatements自动触发修改为true。 在Druid中,不会存在Oracle下PSCache占用内存过多的问题, 可以把这个数值配置大一些,比如说100 |
validationQuery | 用来检测连接是否有效的sql,要求是一个查询语句。 如果validationQuery为null,testOnBorrow、testOnReturn、 testWhileIdle都不会其作用。 |
|
testOnBorrow | true | 申请连接时执行validationQuery检测连接是否有效, 做了这个配置会降低性能。 |
testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效, 做了这个配置会降低性能 |
testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。 |
timeBetweenEvictionRunsMillis | 有两个含义: 1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明 |
|
numTestsPerEvictionRun | 不再使用,一个DruidDataSource只支持一个EvictionRun | |
minEvictableIdleTimeMillis | ||
connectionInitSqls | 物理连接初始化的时候执行的sql | |
exceptionSorter | 根据dbType自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
filters | 属性类型是字符串,通过别名的方式配置扩展插件, 常用的插件有: 监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall |
|
proxyFilters | 类型是List<com.alibaba.druid.filter.Filter>, 如果同时配置了filters和proxyFilters, 是组合关系,并非替换关系 |
表1.1 配置属性
根据常用的配置属性,首先给出一个如下的配置文件,放置于src目录下。
url:jdbc:mysql://localhost:3306/dragoon_v25_masterdb driverClassName:com.mysql.jdbc.Driver username:root password:aaaaaaaa filters:stat maxActive:20 initialSize:1 maxWait:60000 minIdle:10 #maxIdle:15 timeBetweenEvictionRunsMillis:60000 minEvictableIdleTimeMillis:300000 validationQuery:SELECT 'x' testWhileIdle:true testOnBorrow:false testOnReturn:false #poolPreparedStatements:true maxOpenPreparedStatements:20 #对于长时间不使用的连接强制关闭 removeAbandoned:true #超过30分钟开始关闭空闲连接 removeAbandonedTimeout:1800 #将当前关闭动作记录到日志 logAbandoned:true
配置文件1.1
配置项中指定了各个参数后,在连接池内部是这么使用这些参数的。数据库连接池在初始化的时候会创建initialSize个连接,当有数据库操作时,会从池中取出一个连接。如果当前池中正在使用的连接数等于maxActive,则会等待一段时间,等待其他操作释放掉某一个连接,如果这个等待时间超过了maxWait,则会报错;如果当前正在使用的连接数没有达到maxActive,则判断当前是否空闲连接,如果有则直接使用空闲连接,如果没有则新建立一个连接。在连接使用完毕后,不是将其物理连接关闭,而是将其放入池中等待其他操作复用。
同时连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。有些数据库连接的时候有超时限制(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个testWhileIdle参数为true,可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的Connection对象是可用的。当然,为了保证绝对的可用性,你也可以使用testOnBorrow为true(即在获取Connection对象时检测其可用性),不过这样会影响性能。
2 代码编写
2.1 使用spring
首先给出spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 给web使用的spring文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>/WEB-INF/classes/dbconfig.properties</value> </list> </property> </bean> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="driverClassName" value="${driverClassName}" /> <property name="filters" value="${filters}" /> <property name="maxActive" value="${maxActive}" /> <property name="initialSize" value="${initialSize}" /> <property name="maxWait" value="${maxWait}" /> <property name="minIdle" value="${minIdle}" /> <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" /> <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" /> <property name="validationQuery" value="${validationQuery}" /> <property name="testWhileIdle" value="${testWhileIdle}" /> <property name="testOnBorrow" value="${testOnBorrow}" /> <property name="testOnReturn" value="${testOnReturn}" /> <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}" /> <property name="removeAbandoned" value="${removeAbandoned}" /> <!-- 打开removeAbandoned功能 --> <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" /> <!-- 1800秒,也就是30分钟 --> <property name="logAbandoned" value="${logAbandoned}" /> <!-- 关闭abanded连接时输出错误日志 --> </bean> <bean id="dataSourceDbcp" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driverClassName}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <property name="maxActive" value="${maxActive}" /> <property name="minIdle" value="${minIdle}" /> <property name="maxWait" value="${maxWait}" /> <property name="defaultAutoCommit" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" /> <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" /> <property name="validationQuery" value="${validationQuery}" /> <property name="testWhileIdle" value="${testWhileIdle}" /> <property name="testOnBorrow" value="${testOnBorrow}" /> <property name="testOnReturn" value="${testOnReturn}" /> <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}" /> <property name="removeAbandoned" value="${removeAbandoned}" /> <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" /> <property name="logAbandoned" value="${logAbandoned}" /> </bean> <!-- jdbcTemplate --> <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <bean id="SpringTableOperatorBean" class="com.whyun.druid.model.TableOperator" scope="prototype"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> </beans>
纯java代码配置
private static final DruidDataSource cpds = new DruidDataSource(); private static ResourceBundle bundle = null; bundle = ResourceBundle.getBundle("dbconfig", Locale.getDefault()); //基本属性 url、user、password cpds.setUrl(bundle.getString("jdbc.url")); cpds.setUsername(bundle.getString("jdbc.user")); cpds.setPassword(bundle.getString("jdbc.password")); //配置初始化大小、最小、最大 cpds.setInitialSize(1); cpds.setMinIdle(1); cpds.setMaxActive(30); //配置获取连接等待超时的时间 cpds.setMaxWait(60000); //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 cpds.setTimeBetweenEvictionRunsMillis(60000); /**配置一个连接在池中最小生存的时间,单位是毫秒*/ cpds.setMinEvictableIdleTimeMillis(30000); //用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 cpds.setValidationQuery("SELECT 'x'"); //建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 cpds.setTestWhileIdle(true); //申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 cpds.setTestOnBorrow(false); //归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 cpds.setTestOnReturn(false); //打开PSCache,并且指定每个连接上PSCache的大小 mysql5.5及以上请开启 cpds.setPoolPreparedStatements(true); cpds.setMaxPoolPreparedStatementPerConnectionSize(40); //打开removeAbandoned功能 cpds.setRemoveAbandoned(true); cpds.setRemoveAbandonedTimeout(600); cpds.setLogAbandoned(true); //配置监控统计拦截的filters cpds.setFilters("stat");
相关推荐
Druid 的配置方式类似于 dbcp,主要通过配置文件(如 `druid.properties`)来设置参数。以下是一些常用配置项的解释: - **name**: 定义数据源的名字,便于监控和区分多个数据源。 - **jdbcUrl**: 数据库的连接 ...
### Druid简明教程 #### 一、引言 在Java应用程序开发中,数据库操作占据了非常重要的部分。为了提高性能和资源利用率,使用数据库连接池变得非常必要。市面上有许多优秀的数据库连接池实现,如C3P0、DBCP、...
二、Druid配置 在使用Druid时,我们需要进行基本的配置,主要包括以下几个部分: 1. 配置数据源类:在Spring框架中,通常使用`com.alibaba.druid.pool.DruidDataSource`作为数据源类。 2. 数据库连接参数:如URL、...
本教程将详细介绍如何在Java项目中使用Druid数据连接池连接PostgreSQL数据库,以实现一个简单的测试环境。 首先,我们需要了解Druid数据连接池的基本概念。Druid提供了一种高效、灵活的数据库连接管理方式,它可以...
java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池。数据库连接池有很多选择,c3p、dhcp、 proxool等,druid作为一名后起之秀,凭借...接下来本教程就说一下druid的简单使用。
在Spring的配置文件(如applicationContext.xml)中,添加Druid数据源的配置。这包括数据库的基本信息(如URL、用户名、密码),以及Druid的特定配置,如初始化大小、最大连接数等: ```xml ...
本教程将探讨如何利用Spring Boot、Druid、Mybatis以及Atomikos来配置多数据源并实现分布式事务。 首先,Spring Boot是Java生态系统中的一个流行框架,它简化了设置和配置过程,使得开发人员可以快速启动新项目。在...
本教程将围绕"Springboot+Mybatis+Druid多数据源配置"这一主题,详细介绍如何实现这一功能。 首先,Spring Boot简化了Spring应用的初始化和配置。在多数据源场景下,我们可以通过Spring Boot的@...
本教程将详细介绍如何在SSM项目中配置并使用Druid连接池。 首先,我们需要了解Druid的核心优势。Druid提供了监控、扩展性、性能优化等功能。它支持WebStatFilter监控SQL执行情况,可以实时查看数据库连接状态、SQL...
本篇文章是Druid系列教程的一部分,主要介绍了如何使用三种不同的方式来摄入数据和提交任务到Druid集群。首先,我们需要确保Druid已经正确部署并能够正常运行。接下来,我们将详细探讨这三个示例。 **简单示例1:...
本教程将详细介绍如何在MyBatis中利用第三方库Druid来创建数据连接池,并以SQL Server为例进行配置和使用。 首先,我们需要理解MyBatis和Druid的基本概念。MyBatis是一个轻量级的ORM(对象关系映射)框架,它可以将...
本教程将详细介绍如何在Spring Boot项目中集成并使用Druid。 一、Spring Boot与Druid的结合 1. 添加依赖:首先,在Spring Boot项目中引入Druid的数据源依赖。在`pom.xml`或`build.gradle`文件中,你需要添加Druid的...
本教程将详细讲解如何通过SpringMVC、MyBatis和Druid整合实现读写分离,以及在Windows环境下MySQL的主从复制配置。 首先,让我们了解SpringMVC、MyBatis和Druid的基本概念。SpringMVC是Spring框架的一部分,用于...
本教程将全面介绍Druid的核心特性和如何在实际项目中配置和使用Druid监控。 1. **Druid数据库连接池** Druid作为数据库连接池,它的主要职责是管理数据库连接,提供高效的数据库访问性能。相比于其他连接池如C3P0...
Druid作为一款高性能、功能丰富的数据库连接池,相比其他如C3P0、DBCP等,具有更好的监控和扩展性,但相关的整合教程或示例可能相对较少,因此这个项目为开发者提供了一个实践和学习的平台。 【知识点】: 1. **...
本教程将详细介绍如何在Spring Boot项目中整合Druid数据源池与Mybatis,实现多数据源切换的功能,并提供一个亲测可用的解决方案。 首先,让我们了解Spring Boot、Druid和Mybatis这三大组件的基础知识: **Spring ...
本实战教程将详细讲解如何使用Druid连接池来操作数据库,并提供所需jar包。 首先,要使用Druid,我们需要引入相应的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml <groupId>...
本教程将详细讲解如何使用Spring Boot、Druid和Mybatis来实现JTA(Java Transaction API)分布式事务。这是一项高级技术,它允许在多数据库环境或者微服务架构中进行一致性的数据操作。 首先,让我们了解什么是JTA...
总的来说,这个教程涵盖了Spring Boot项目搭建、Gradle配置、依赖管理、Spring Boot配置、MyBatis和Druid的使用,以及Gbase8s数据库的连接。通过这个过程,开发者可以学习到如何在实际项目中整合这些技术,实现高效...
要开启Druid的内置监控,我们需要在配置文件中添加相关参数。例如,在Spring的XML配置中,我们会定义一个DataSource bean,其中包含监控的相关属性,如: ```xml <bean id="dataSource" class="com.alibaba.druid....