每天的第一句话:不断学习!不断积累!
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&useUnicode=true&characterEncoding=utf-8&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可查看数据库访问情况