Druid 学习

每天的第一句话:不断学习!不断积累!

1.认识Druid:

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

Druid与DBCP,C3P0的区别:

    1)DBCP
  DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP。
 2)c3p0
  c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
    3)Druid
  阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个 SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQLParser,支持Visitor模式,使得分析SQL的抽象语法树很方便。简单SQL语句用时10微秒以内,复杂SQL用时30微秒。通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。

2.Druid的配置

Druid的各项参数作用请移步https://github.com/alibaba/druid

Druid maven 地址:

<!-- alibaba 数据库连接池-->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.10</version>
</dependency>

Druid 配置清单

jdbc.url=jdbc:mysql://localhost:3306/druid?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=yourpassword
jdbc.filters= stat
#连接池建立时创建的初始化连接数
jdbc.initialSize= 2
#连接池中最大的活跃连接数
jdbc.maxActive= 20
#连接池中最小空闲连接数
jdbc.minIdle= 2
#配置获取连接等待超时的时间 (毫秒)
jdbc.maxWait= 60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
jdbc.timeBetweenEvictionRunsMillis= 60000
#配置一个连接在池中最小生存的时间,单位是毫秒
jdbc.minEvictableIdleTimeMillis= 300000
#用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用
jdbc.validationQuery= SELECT 'x'
#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
jdbc.testWhileIdle= true
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
jdbc.testOnBorrow= false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
jdbc.testOnReturn= false
#缓存PreparedStatements,也就是PSCache,支持游标的数据库才有用 如oracle mysql5.5以上
#要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements 自!动 !触  !发!修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
jdbc.maxPoolPreparedStatementPerConnectionSize= 100

applicationContext-resources.xml配置

<?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/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

    <!-- druid 配置信息 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="locations">
            <list>
                <value>classpath:druid.properties</value>
            </list>
        </property>
    </bean>

    <!-- 阿里 druid 数据库连接池 -->
    <bean id = "dataSource" class = "com.alibaba.druid.pool.DruidDataSource" destroy-method = "close" >
        <!-- 数据库基本信息配置 -->
        <property name = "url" value = "${jdbc.url}" />
        <property name = "username" value = "${jdbc.username}" />
        <property name = "password" value = "${jdbc.password}" />
        <property name = "driverClassName" value = "${jdbc.driverClassName}" />
        <property name = "filters" value = "${jdbc.filters}" />
        <property name = "maxActive" value = "${jdbc.maxActive}" />
        <property name = "initialSize" value = "${jdbc.initialSize}" />
        <property name = "maxWait" value = "${jdbc.maxWait}" />
        <property name = "minIdle" value = "${jdbc.minIdle}" />
        <property name = "timeBetweenEvictionRunsMillis" value ="${jdbc.timeBetweenEvictionRunsMillis}" />
        <property name = "minEvictableIdleTimeMillis" value ="${jdbc.minEvictableIdleTimeMillis}" />
        <property name = "validationQuery" value = "${jdbc.validationQuery}" />
        <property name = "testWhileIdle" value = "${jdbc.testWhileIdle}" />
        <property name = "testOnBorrow" value = "${jdbc.testOnBorrow}" />
        <property name = "testOnReturn" value = "${jdbc.testOnReturn}" />
        <property name = "maxPoolPreparedStatementPerConnectionSize" value ="${jdbc.maxPoolPreparedStatementPerConnectionSize}" />
    </bean>

    <!-- druid监控统计bean 对应上文dataSource中的proxyFilters -->
    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
        <property name="slowSqlMillis" value="1000"/>
        <property name="logSlowSql" value="true"/>
    </bean>
</beans>

applicationContext-dao.xml配置

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

    <bean class="org.springframework.orm.hibernate5.HibernateExceptionTranslator"/>
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    
    <!-- Hibernate SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" destroy-method="destroy">
         <!-- 多租户remove -->
        <property name="dataSource" ref="dataSource"/>
<!--         <property name="configLocation" value="classpath:hibernate.cfg.xml"/> -->
        <property name="packagesToScan" value="com.xixi.model"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>
                <prop key="hibernate.cache.use_second_level_cache">false</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                <!-- 多租户add -->
<!--                 <prop key="hibernate.multiTenancy">SCHEMA</prop> -->
<!--                 <prop key="hibernate.tenant_identifier_resolver">com.xixi.dao.hibernate.CurrentTenantIdentifierResolverHibernate</prop> -->
<!--                 <prop key="hibernate.multi_tenant_connection_provider">com.xixi.dao.hibernate.MultiTenantConnectionProviderHibernate</prop> -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">false</prop>
                <prop key="hibernate.use_sql_comments">false</prop>
                <!-- Hibernate Search index directory -->
<!--                 <prop key="hibernate.search.default.indexBase">${app.search.index.basedir}</prop> -->
            </props>
            <!-- Turn batching off for better error messages under PostgreSQL -->
            <!-- hibernate.jdbc.batch_size=0 -->
        </property>
    </bean>

    <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
        <property name="autodetectDataSource" value="false"/>
    </bean>

    <!-- Activates scanning of @Autowired -->
    <context:annotation-config/>

    <!-- Activates scanning of @Repository -->
    <context:component-scan base-package="com.xixi.dao" />

</beans>

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    <display-name>zqdj</display-name>
    <distributable/>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:/applicationContext-resources.xml
            classpath:/applicationContext-dao.xml
        </param-value>
    </context-param>

    <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>
    <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>
    <!-- 连接池 启用 Web 监控统计功能    end-->


    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter> 
</web-app>

配置完成!

启动项目 输入http://id:port/appName/druid/index.html可查看数据库访问情况

猜你喜欢

转载自blog.csdn.net/weixin_37555975/article/details/80761219