说说如何通过 JNDI 让 Tomcat 使用 Druid 连接池

0.36字数 447阅读 252

JNDI(Java Naming and Directory Interface,Java 命名和目录接口 ) 是 SUN 公司提供的一种标准的 Java 命名系统接口, 它提供了统一的客户端 API ,通过不同的访问者来实现 JNDI 服务供应接口 (SPI),并由管理者将 JNDI API 映射为特定的命名服务和目录系统,使得 Java 应用程序可以和这些命名服务和目录服务之间进行交互 , 类似 JDBC 都是构建在抽象层上 。 JNDI 已经成为 J2EE 的标准之一,所有的 J2EE 容器都必须提供一个 JNDI 的服务 。

Druid 是阿里巴巴数据库事业部出品,以 Java 为实现语言,为监控而生的数据库连接池。

我们通过 JNDI 让 Tomcat 使用 Druid 连接池,用于监控 Tomcat 容器内应用的连接情况。

1 下载并安装 Druid

到 Maven 中央仓库中,下载最新版的 Druid jar 包(下载地址)。

放入 Tomcat 的 lib 目录,即 ${tomcat_home}/lib。

2 配置监控 servlet

在 ${tomcat_home}/conf/web.xml 中,配置监控 servlet:

<!-- 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>true</param-value>
        </init-param>
        <init-param>
        <!-- 用户名 -->
        <param-name>loginUsername</param-name>
        <param-value>admin</param-value>
        </init-param>
        <init-param>
        <!-- 密码 -->
        <param-name>loginPassword</param-name>
        <param-value>xxx</param-value>
    </init-param>
</servlet>
 
<servlet-mapping>
    <servlet-name>DruidStatView</servlet-name>
    <url-pattern>/druid/*</url-pattern>
</servlet-mapping>  

这样配置之后,就可以通过以下地址访问监控登录页:http://[IP 地址][端口]/druid/index.html

其中的 loginUsername 和 loginPassword,是配置监控登录页的账号与密码。

3 配置 web 统计过滤器

配置 web 统计过滤器,它用于采集与 web-jdbc 相关联的监控数据:

<!-- web 统计过滤器 -->
<filter>
    <filter-name>DruidWebStatFilter</filter-name>
    <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
    <!-- exclusions:排除一些不必要的url-->
    <init-param>
        <param-name>exclusions</param-name>
        <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,*.mp3,/druid/*</param-value>
    </init-param>
    <!-- session 统计最大个数 -->
    <init-param>
        <param-name>sessionStatMaxCount</param-name>
        <param-value>1000</param-value>
    </init-param>
    <!-- 是否开启统计功能 -->
    <init-param>
        <param-name>sessionStatEnable</param-name>
        <param-value>true</param-value>
    </init-param>
    <!-- 当前 session 的用户-->
    <init-param>
        <param-name>principalSessionName</param-name>
        <param-value>xxx</param-value>
    </init-param>
    <!-- 监控单个 url 调用的 sql 列表-->
    <init-param>
    <param-name>profileEnable</param-name>
    <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>DruidWebStatFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

各项配置说明如下:

参数 说明
exclusions 用于排除一些不必要的 url ,比如网站的静态资源 。
sessionStatMaxCount 需要统计 Session 的最大数量。
sessionStatEnable 是否开启 session 统计功能。
principalSessionName 保存在 session 中的 sessionName,就能记录当前登陆的 session 的用户。如果 session 中保存的是非 string 类型的对象,那么就需要重载 toString 方法 。
profileEnable 是否监控单个 url 调用的 sql 列表。开启之后,就能在 URI 监控页签内,点击某个 URL 请求,看到这个请求所涉及的所有 SQL 列表。

4 配置 JNDI 数据源

在 ${tomcat_home}/conf/context.xml 中,配置 JNDI 数据源:

<Resource name="xxx" auth="Container" type="javax.sql.DataSource" factory="com.alibaba.druid.pool.DruidDataSourceFactory"
username="xxx"
password="xxx"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@xxx:1521:xxx"
filters="stat"
connectionProperties="druid.stat.mergeSql=true;druid.stat.slowSqlMillis=2000"
useGlobalDataSourceStat="true"
defaultTransactionIsolation="READ_COMMITTED"
validationQuery="select 1 from dual"
removeAbandoned="true"
logAbandoned="true"
removeAbandonedTimeout="1800"
maxActive="20"
initialSize="5"
maxWait="60000"
minIdle="10"
timeBetweenEvictionRunsMillis="60000"
minEvictableIdleTimeMillis="300000"
testWhileIdle="true"
testOnBorrow="false"
testOnReturn="false"
poolPreparedStatements="false"
maxOpenPreparedStatements="20"
asyncInit="true"
 />

5 监控界面

启动 Tomcat 后,在浏览器中键入 http://[IP 地址][端口]/druid/index.html,就可以看到监控界面啦:

推荐阅读更多精彩内容