数据库连接池 Druid 是阿里的一个数据库连接框架,功能比较强大,性能比较优越;相信越来越多的项目使用,同时可以通过简单的配置可以直接对站点进行多方面的性能进行监控,如下就简要介绍在项目中的使用;
使用 druid 框架有一个前提,即是必须有其对应的 jar 包;jar有各个版本,建议使用高版本;我使用的如下:
druid-1.1.2.jar,如果是 eclipse 在 pom.xml 中使用对应的依赖如下:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.2</version> </dependency>
一,数据库连接池 Druid 的应用;
下面是在项目中使用 druid 框架,这里在spring的配置文件 applicationContext.xml 中使用 druid 框架,连接 MS SQL Server 数据库;
<!-- ali Druid框架的数据库连接池功能更强大更稳健,同时通过配置可对站点SQL,RUI访问,session,spring等进行在线监控 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=数据库名称"/> <property name="username" value="DB用户名"/> <property name="password" value="DB密码"/> <!-- DB driverName: mysql: com.mysql.jdbc.Driver; SQLServerV2005+: com.microsoft.sqlserver.jdbc.SQLServerDriver Oracle: oracle.jdbc.driver.OracleDriver DB URL: mysql: jdbc:mysql://localhost:3306/mySqlDBName?useUnicode=true&characterEncoding=UTF-8 SQLServerV2005+: jdbc:sqlserver://localhost:1433;databaseName=myDataBaseName Oracle: jdbc:oracle:thin:@localhost(/IP):1521(/port):oracleSID --> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="10"/> <property name="minIdle" value="10"/> <property name="maxActive" value="50"/> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000"/> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <!-- 用来检测连接是否有效的sql,要求是一个查询语句 --> <property name="validationQuery" value="SELECT 1" /> <!-- 申请连接的时候检测 --> <property name="testWhileIdle" value="true" /> <!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 --> <property name="testOnBorrow" value="false" /> <!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 --> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false --> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置监控统计拦截的filters --> <property name="filters" value="wall,stat" /> </bean> <!-- 其它省略... -->
二,通过配置,启用 druid 框架的一些性能监控;
1,数据库性能的监控;
启用 druid 框架的监控性能,首先在项目 web.xml 中配置druid相关的servlet;
<!-- 配置druid框架内置站点监控页面,以便查看,可以不用;参考如下:--> <servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <!-- 这里的可以设置druid的访问用户名和密码,但这些与web项目的账户无关, 可以通过系统登录的过滤器或spring等其他框架统一进行访问权限过滤 --> <!-- <init-param> <param-name>loginUsername</param-name> <param-value>mydruid</param-value> </init-param> <init-param> <param-name>loginPassword</param-name> <param-value>121212</param-value> </init-param> --> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping> <!-- 可以查看内置部分性能监控页面,路径是/druid/index.html; 完整路径是 http://127.0.0.1(/ip):8080(/port)/projectName/druid/index.html -->
至此,你可以在项目启动时访问该地址 http://127.0.0.1(/ip):8080(/port)/projectName/druid/index.html 即可查看部分的性能监控情况,主要是数据库方面的;
2,增加对 web 一些性能的监控;
WebStatFilter本身是一个过滤器,根据配置的过滤范围,可对web的一些内容进行监控,例如下:
<!-- 增加如下druid框架相关的filter,可使用Web应用、URI监控、Session监控等功能,可以不用 --> <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,*.bmp,*.css,*.ico,/druid/*</param-value> </init-param> <init-param> <param-name>profileEnable</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>principalCookieName</param-name> <param-value>USER_COOKIE</param-value> </init-param> <init-param> <param-name>principalSessionName</param-name> <param-value>USER_SESSION</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidWebStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
根据过滤器应用的范围 <url-pattern>/*</url-pattern> 也即所有的路径都进行监控,
3,增加对 spring 部分性能的监控;
在spring的配置文件 applicationContext.xml 中增加如下配置,启用 druid 对 spring相关的监控
<bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"></bean> <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype"> <property name="patterns"> <list> <value>com.xxx.yyy.service.*</value> <value>com.xxx.kkk.service.*</value> <!-- 分别监控com.xxx.yyy.service包和com.xxx.kkk.service包下所有的类(的所有方法); 根据需要可增加更多的监控相关的包 --> </list> </property> </bean> <aop:config proxy-target-class="true"> <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut" /> </aop:config> <!--这里可见是通过AOP即使用面向切面的方式进行监控-->
至此,完成 druid 配置启用对 spring 相关包(一般是接口包)进行的监控;
上面两大方面配置完,基本对站点的数据库,web部分功能,spring部分性能都可以进行监控了,在页面可以直接浏览,相关页面都不用写,内置已经有了,通过 http://127.0.0.1(/ip):8080(/port)/projectName/druid/index.html 可以直接访问,相当方便;最后提醒这个地址如果不设置访问权限,任意人都可以访问,当然不是我们希望的,应该使用web项目相关的权限功能对路径 /druid/* 进行访问限制,例如在 web.xml 中配置 filter对其进行访问过滤,
<filter> <filter-name>SystemAdminFilter</filter-name> <filter-class> com.xxx.yyy.filter.SystemAdminFilter </filter-class> </filter> <filter-mapping> <filter-name>SystemAdminFilter</filter-name> <url-pattern>/system/*</url-pattern> <url-pattern>/druid/*</url-pattern> </filter-mapping>
类 com.xxx.yyy.filter.SystemAdminFilter 就是具体实现访问过滤的类,具体功能自己可以自己写;
到此结束了,欢迎拍砖讨论...