Druid是一个JDBC组件,它包括三部分:
Druid可以做什么?
1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
4) SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。
官方语言结束。
首先是jar配置,找到pom.xml
pom.xml
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-oscache</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
然后是applicationContext.xml
<!-- 数据库配置文件位置 -->
<context:property-placeholder location="classpath:config\jdbc.properties" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="url" value="${jdbc_url}" />
<property name="username">
<value>${jdbc_user}</value>
</property>
<property name="password" value="${jdbc_password}" />
<!-- 若密碼加密需指定程序解密 -->
<property name="connectionProperties" value="config.decrypt=true" />
<!-- 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName -->
<!-- <property name="driverClassName" value="${driverClass}" /> -->
<!-- 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall -->
<property name="filters">
<value>${filters}</value>
</property>
<!-- 最大连接池数量 -->
<property name="maxActive">
<value>${maxActive}</value>
</property>
<!-- 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 -->
<property name="initialSize">
<value>${initialSize}</value>
</property>
<!-- 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 -->
<!-- <property name="maxWait"><value>60000</value></property> -->
<!-- 最小连接池数量 -->
<property name="minIdle">
<value>${minIdle}</value>
</property>
<!-- 有两个含义:1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明 -->
<property name="timeBetweenEvictionRunsMillis">
<value>${timeBetweenEvictionRunsMillis}</value>
</property>
<property name="minEvictableIdleTimeMillis">
<value>${minEvictableIdleTimeMillis}</value>
</property>
<!-- 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 -->
<!-- <property name="validationQuery"><value></value></property> -->
<!-- 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 -->
<property name="testWhileIdle">
<value>${testWhileIdle}</value>
</property>
<!-- 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 -->
<property name="testOnBorrow">
<value>${testOnBorrow}</value>
</property>
<!-- 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 -->
<property name="testOnReturn">
<value>${testOnReturn}</value>
</property>
<!-- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 -->
<!-- <property name="poolPreparedStatements"><value>false</value></property> -->
<!-- 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 -->
<!-- <property name="maxOpenPreparedStatements"><value>-1</value></property> -->
<!-- 配置removeAbandoned对性能会有一些影响,建议怀疑存在泄漏之后再打开。在上面的配置中,如果连接超过30分钟未关闭,就会被强行回收,并且日志记录连接申请时的调用堆栈。 -->
<!-- 打开removeAbandoned功能 -->
<!-- <property name="removeAbandoned" value="true" /> -->
<!-- 1800秒,也就是30分钟 -->
<!-- <property name="removeAbandonedTimeout" value="1800" /> -->
<!-- 关闭abanded连接时输出错误日志 -->
<!-- <property name="logAbandoned" value="true" /> -->
</bean>
<!-- 配置druid监控spring jdbc -->
<bean id="druid-stat-interceptor"
class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor" />
<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
scope="prototype">
<property name="patterns">
<list>
<value>com.cmicroentropy.soa.controller.*</value>
<value>com.cmicroentropy.soa.service.*</value>
</list>
</property>
</bean>
<aop:config proxy-target-class="true">
<aop:advisor advice-ref="druid-stat-interceptor"
pointcut-ref="druid-stat-pointcut" />
</aop:config>
另外druid的一个特点就是监控,在web.xml加上
<!--
druid监控,生产环境建议关闭 -->
<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>
<!-- 开启session统计功能 -->
<init-param>
<param-name>sessionStatEnable</param-name>
<param-value>false</param-value>
</init-param>
<!-- profileEnable能够监控单个url调用的sql列表。 -->
<init-param>
<param-name>profileEnable</param-name>
<param-value>false</param-value>
</init-param>
<!-- 你可以配置principalSessionName,使得druid能够知道当前的session的用户是谁,根据需要,把其中的xxx.user修改为你user信息保存在session中的sessionName。注意:如果你session中保存的是非string类型的对象,需要重载toString方法。 -->
<init-param>
<param-name>principalSessionName</param-name>
<param-value>user</param-value>
</init-param>
<!-- 缺省sessionStatMaxCount是1000个 -->
<init-param>
<param-name>sessionStatMaxCount</param-name>
<param-value>1000</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 静态文件 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.swf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.woff</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ttf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.map</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.eot</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.svg</url-pattern>
</servlet-mapping>
<!--
druid监控后台设置-->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<!-- 是否允许重置 -->
<init-param>
<param-name>resetEnable</param-name>
<param-value>false</param-value>
</init-param>
<!-- 用户密码权限 -->
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>scc</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>scc123</param-value>
</init-param>
<!-- ip权限 <init-param> <param-name>allow</param-name> <param-value>127.0.0.1</param-value>
</init-param> <init-param> <param-name>deny</param-name> <param-value></param-value>
</init-param> -->
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
好了,最终会有一个文章,贴出整个项目的各个配置文件,不要急。