DRUID數據庫連接池

阿里出品,淘寶和支付寶專用數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個SQL Parser。支持所有JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。

優勢

相較於c3p0、dbcp連接池

  1. 可以監控數據庫訪問性能,內置StatFilter插件可以詳細統計數據庫訪問情況和SQL執行性能
  2. 可以加密數據庫密碼,DruidDruiver和DruidDataSource都支持PasswordCallback
  3. 可擴展性更好,通過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件
  4. 通過Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。Druid防禦SQL注入攻擊的WallFilter就是通過Druid的SQL Parser分析語義實現的。
  5. 性能更加優秀,簡單SQL語句用時10微秒以內,複雜SQL用時30微秒

使用

使用方式有3種:

  1. 直接設置數據源參數並建立連接池
  2. XML配置數據源,讀取數據源並建立連接池
  3. XML配置連接池,獲取連接池

POM引入

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.2</version>
</dependency>

方法一:直接設置數據源參數並建立連接池


    @Test
    public void druidPoolTest() throws SQLException {
        /**
         * 直接連接DRUID連接池
         * 1. 配置數據源參數
         * 2. 連接數據庫
         * 3. 預編譯SQL
         * 4. 執行SQL
         */
        DruidDataSource druidDataSource = new DruidDataSource();

        druidDataSource.setUrl(URL);
        druidDataSource.setUsername(USERNAME);
        druidDataSource.setPassword(PASSWORD);
        druidDataSource.setDriverClassName(DRIVER_CLASS_NAME);

        druidDataSource.setInitialSize(INITIAL_SIZE);
        druidDataSource.setMaxActive(MAX_ACTIVE);
        druidDataSource.setMaxWait(MAX_WAIT);
        druidDataSource.setMinIdle(MIN_IDLE);

        Connection connection = druidDataSource.getConnection();

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery(QUERYSQL);

        while (resultSet.next()) {
            System.out.println(resultSet.getInt(1));
        }
    }

方法二:XML配置數據源,讀取數據源並建立連接池

連接參數:druid.properties

#驅動名
driverClassName=com.mysql.jdbc.Driver
#url
url=jdbc:mysql://*.*.*.*:*/*
#用戶名
user=*
#密碼
password=*
#初試連接數
initialSize=5
#最大活躍數
maxTotal=5
#最大idle數
maxIdle=2
#最小idle數
minIdle=1

數據源配置:druid.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="druid.properties"/>
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="druidDataSource">
        <property name="driverClassName" value="${driverClassName}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
        <property name="url" value="${url}"/>
        <property name="initialSize" value="${initialSize}"/>
        <property name="maxActive" value="${maxTotal}"/>
        <property name="minIdle" value="${minIdle}"/>
    </bean>
</beans>

代碼實現

    @Test
    public void druidDataSourceFromXmlTest() throws IOException, SQLException {
        /**
         * 從XML配置中獲取數據源
         * 1. 配置數據源
         * 2. 獲取數據庫連接
         * 3. 預編譯SQL
         * 4. 執行SQL
         */

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("druid.xml");

        DruidDataSource druidDataSource = applicationContext.getBean("druidDataSource", DruidDataSource.class);

        Connection connection = druidDataSource.getConnection();

        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery(QUERYSQL);

        while (resultSet.next()) {
            System.out.println(resultSet.getInt(1));
        }

    }

方法三:XML配置連接池,獲取連接池

連接參數:druid.properties

#驅動名
driverClassName=com.mysql.jdbc.Driver
#url
url=jdbc:mysql://*.*.*.*:*/OWL
#用戶名
user=*
#密碼
password=*
#初試連接數
initialSize=5
#最大活躍數
maxTotal=5
#最大idle數
maxIdle=2
#最小idle數
minIdle=1

數據源配置:druid.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder location="druid.properties"/>
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="druidDataSource">
        <property name="driverClassName" value="${driverClassName}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
        <property name="url" value="${url}"/>
        <property name="initialSize" value="${initialSize}"/>
        <property name="maxActive" value="${maxTotal}"/>
        <property name="minIdle" value="${minIdle}"/>
    </bean>

    <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
        <property name="dataSource" ref="druidDataSource"/>
    </bean>
</beans>

代碼實現

    @Test
    public void druidPoolFromXmlTest() throws IOException, SQLException {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("druid.xml");

        JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);

        Integer integer = jdbcTemplate.queryForObject(QUERYSQL, Integer.class);

        System.out.println(integer);

    }

完整參數說明

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
      <!-- 基本屬性 url、user、password -->
      <property name="url" value="${jdbc_url}" />
      <property name="username" value="${jdbc_user}" />
      <property name="password" value="${jdbc_password}" />

      <!-- 配置初始化大小、最小、最大 -->
      <property name="initialSize" value="1" />
      <property name="minIdle" value="1" /> 
      <property name="maxActive" value="20" />

      <!-- 配置獲取連接等待超時的時間 -->
      <property name="maxWait" value="60000" />

      <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 -->
      <property name="timeBetweenEvictionRunsMillis" value="60000" />

      <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
      <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" />

      <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
      <property name="poolPreparedStatements" value="true" />
      <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

      <!-- 配置監控統計攔截的filters -->
      <property name="filters" value="stat" /> 
</bean>

連接池監控

<!-- Druid連接池監控 -->
<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>  
<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>
</filter>
<filter-mapping>
    <filter-name>DruidWebStatFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

spring.datasource.type= com.alibaba.druid.pool.DruidDataSource
# 初始連接數
spring.datasource.druid.initialSize= 5
# 最小連接池數量
spring.datasource.druid.minIdle= 5
# 最大連接池數量
spring.datasource.druid.maxActive= 20
# 配置間隔多久才進行一次檢測需要關閉的空閒連接,單位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis= 60000
# 配置一個連接在池中最小生存的時間,單位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis= 300000
# 配置一個連接在池中最大生存的時間,單位是毫秒
spring.datasource.druid.maxEvictableIdleTimeMillis= 900000
# 配置檢測連接是否有效
spring.datasource.druid.validationQuery= select 'x'
# 申請連接時執行validationQuery檢測連接是否有效
spring.datasource.druid.testWhileIdle= true
spring.datasource.druid.testOnBorrow= false
spring.datasource.druid.testOnReturn= false
# wall防禦sql注入過濾
spring.datasource.druid.filter.wall.enabled=true
# 是否允許一次執行多條語句,缺省關閉
spring.datasource.druid.filter.wall.config.multi-statement-allow=true
# stat監控統計過濾
spring.datasource.druid.filter.stat.enabled=true
# 慢SQL記錄
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=5000
spring.datasource.druid.filter.stat.merge-sql=true
# 開啓druid監控統計頁(數據源配置、sql監控、防禦攔截、url用時統計等等) localhost:port/druid
spring.datasource.druid.StatViewServlet.loginUsername=druid
spring.datasource.druid.StatViewServlet.loginPassword=druid
spring.datasource.druid.StatViewServlet.allow=127.0.0.1
# 不攔截統計的URL
spring.datasource.druid.WebStatFilter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章