`
阅读更多

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简单教程.docx

    Druid 的配置方式类似于 dbcp,主要通过配置文件(如 `druid.properties`)来设置参数。以下是一些常用配置项的解释: - **name**: 定义数据源的名字,便于监控和区分多个数据源。 - **jdbcUrl**: 数据库的连接 ...

    druid简单教程

    ### Druid简明教程 #### 一、引言 在Java应用程序开发中,数据库操作占据了非常重要的部分。为了提高性能和资源利用率,使用数据库连接池变得非常必要。市面上有许多优秀的数据库连接池实现,如C3P0、DBCP、...

    druid简单教程.zip

    二、Druid配置 在使用Druid时,我们需要进行基本的配置,主要包括以下几个部分: 1. 配置数据源类:在Spring框架中,通常使用`com.alibaba.druid.pool.DruidDataSource`作为数据源类。 2. 数据库连接参数:如URL、...

    使用Druid数据连接池连接PostgreSQL简单例子

    本教程将详细介绍如何在Java项目中使用Druid数据连接池连接PostgreSQL数据库,以实现一个简单的测试环境。 首先,我们需要了解Druid数据连接池的基本概念。Druid提供了一种高效、灵活的数据库连接管理方式,它可以...

    druid配置详解

    java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池。数据库连接池有很多选择,c3p、dhcp、 proxool等,druid作为一名后起之秀,凭借...接下来本教程就说一下druid的简单使用。

    druid数据源集成详细步骤

    在Spring的配置文件(如applicationContext.xml)中,添加Druid数据源的配置。这包括数据库的基本信息(如URL、用户名、密码),以及Druid的特定配置,如初始化大小、最大连接数等: ```xml ...

    Spring Boot + Druid + Mybatis + Atomikos 配置多数据源 并支持分布式事务

    本教程将探讨如何利用Spring Boot、Druid、Mybatis以及Atomikos来配置多数据源并实现分布式事务。 首先,Spring Boot是Java生态系统中的一个流行框架,它简化了设置和配置过程,使得开发人员可以快速启动新项目。在...

    Springboot+Mybatis+Druid多数据源配置

    本教程将围绕"Springboot+Mybatis+Druid多数据源配置"这一主题,详细介绍如何实现这一功能。 首先,Spring Boot简化了Spring应用的初始化和配置。在多数据源场景下,我们可以通过Spring Boot的@...

    SSM中使用Druid连接池代码

    本教程将详细介绍如何在SSM项目中配置并使用Druid连接池。 首先,我们需要了解Druid的核心优势。Druid提供了监控、扩展性、性能优化等功能。它支持WebStatFilter监控SQL执行情况,可以实时查看数据库连接状态、SQL...

    2、Druid的入门示例(使用三种不同的方式摄入数据和提交任务)

    本篇文章是Druid系列教程的一部分,主要介绍了如何使用三种不同的方式来摄入数据和提交任务到Druid集群。首先,我们需要确保Druid已经正确部署并能够正常运行。接下来,我们将详细探讨这三个示例。 **简单示例1:...

    MyBatis 通过第三方Druid数据连接池连接SQL server 简单例子

    本教程将详细介绍如何在MyBatis中利用第三方库Druid来创建数据连接池,并以SQL Server为例进行配置和使用。 首先,我们需要理解MyBatis和Druid的基本概念。MyBatis是一个轻量级的ORM(对象关系映射)框架,它可以将...

    spring-boot-druid

    本教程将详细介绍如何在Spring Boot项目中集成并使用Druid。 一、Spring Boot与Druid的结合 1. 添加依赖:首先,在Spring Boot项目中引入Druid的数据源依赖。在`pom.xml`或`build.gradle`文件中,你需要添加Druid的...

    springmvc-mybatis 整合druid多数据源配置读写实现读写分离,windows上mysql主从复制

    本教程将详细讲解如何通过SpringMVC、MyBatis和Druid整合实现读写分离,以及在Windows环境下MySQL的主从复制配置。 首先,让我们了解SpringMVC、MyBatis和Druid的基本概念。SpringMVC是Spring框架的一部分,用于...

    druid 阿里监控

    本教程将全面介绍Druid的核心特性和如何在实际项目中配置和使用Druid监控。 1. **Druid数据库连接池** Druid作为数据库连接池,它的主要职责是管理数据库连接,提供高效的数据库访问性能。相比于其他连接池如C3P0...

    spring3+hibernate4+springmvc+druid连接池

    Druid作为一款高性能、功能丰富的数据库连接池,相比其他如C3P0、DBCP等,具有更好的监控和扩展性,但相关的整合教程或示例可能相对较少,因此这个项目为开发者提供了一个实践和学习的平台。 【知识点】: 1. **...

    Springboot整合Druid与Mybatis的多数据源切换

    本教程将详细介绍如何在Spring Boot项目中整合Druid数据源池与Mybatis,实现多数据源切换的功能,并提供一个亲测可用的解决方案。 首先,让我们了解Spring Boot、Druid和Mybatis这三大组件的基础知识: **Spring ...

    实现连接池druid操作数据库实战-包含所需要的jar包

    本实战教程将详细讲解如何使用Druid连接池来操作数据库,并提供所需jar包。 首先,要使用Druid,我们需要引入相应的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;...

    Spring Boot+Druid+Mybatis实现JTA分布式事务

    本教程将详细讲解如何使用Spring Boot、Druid和Mybatis来实现JTA(Java Transaction API)分布式事务。这是一项高级技术,它允许在多数据库环境或者微服务架构中进行一致性的数据操作。 首先,让我们了解什么是JTA...

    springboot整合druid、mybatis连接gbase8s.doc

    总的来说,这个教程涵盖了Spring Boot项目搭建、Gradle配置、依赖管理、Spring Boot配置、MyBatis和Druid的使用,以及Gbase8s数据库的连接。通过这个过程,开发者可以学习到如何在实际项目中整合这些技术,实现高效...

    初探Druid连接池之三——进入内置监控页面(连接数据源后)

    要开启Druid的内置监控,我们需要在配置文件中添加相关参数。例如,在Spring的XML配置中,我们会定义一个DataSource bean,其中包含监控的相关属性,如: ```xml &lt;bean id="dataSource" class="com.alibaba.druid....

Global site tag (gtag.js) - Google Analytics