首页 > 代码库 > JNDI学习总结(三)——Tomcat下使用Druid配置JNDI数据源
JNDI学习总结(三)——Tomcat下使用Druid配置JNDI数据源
com.alibaba.druid.pool.DruidDataSourceFactory实现了javax.naming.spi.ObjectFactory,可以作为JNDI数据源来配置。
一、下载Druid的jar包
下载地址:http://mvnrepository.com/artifact/com.alibaba/druid/1.0.9,如下图所示:
druid.jar依赖log4j的jar包,所以还需要下载log4j的jar包。
log4j的下载地址如下:http://mvnrepository.com/artifact/log4j/log4j/1.2.17,如下图所示:
二、使用Druid配置JNDI数据源
2.1、前期准备工作
创建一个Web测试项目Druid_JNDI_Config,将下载下来druid-1.0.9.jar和log4j-1.2.17.jar添加到项目中,在项目的META-INF目录下创建一个context.xml文件
目录结构如下图所示:
在tomcat服务器的lib目录下添加Oracle、MySQL、SQLServer三种数据库的驱动jar包,如下图所示:
2.2、在context.xml文件中加入JNDI的配置信息
在context.xml文件中加入如下配置信息
1 <Context> 2 <!-- 使用阿里巴巴的DruidDataSource配置针对Oracle数据库的JNDI数据源 --> 3 <Resource 4 name="jdbc/OracleDataSource" 5 factory="com.alibaba.druid.pool.DruidDataSourceFactory" 6 auth="Container" 7 type="javax.sql.DataSource" 8 driverClassName="oracle.jdbc.OracleDriver" 9 url="jdbc:oracle:thin:@192.168.1.229:1521:lead"10 username="lead_oams"11 password="p"12 maxActive="50"13 maxWait="10000"14 removeabandoned="true"15 removeabandonedtimeout="60"16 logabandoned="false"17 filters="stat"/>18 19 <!-- 使用阿里巴巴的DruidDataSource配置针对MySQL数据库的JNDI数据源 -->20 <Resource 21 name="jdbc/MysqlDataSource"22 factory="com.alibaba.druid.pool.DruidDataSourceFactory"23 auth="Container"24 type="javax.sql.DataSource"25 driverClassName="com.mysql.jdbc.Driver"26 url="jdbc:mysql://192.168.1.233:3306/lead_oams?useUnicode=true&characterEncoding=utf-8"27 username="lead_system"28 password="password"29 maxActive="50"30 maxWait="10000"31 removeabandoned="true"32 removeabandonedtimeout="60"33 logabandoned="false"34 filters="stat"/>35 36 <!--使用阿里巴巴的DruidDataSource配置针对SQLServer数据库的JNDI数据源-->37 <Resource 38 name="jdbc/SqlServerDataSource"39 auth="Container"40 factory="com.alibaba.druid.pool.DruidDataSourceFactory" 41 type="javax.sql.DataSource"42 driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"43 url="jdbc:sqlserver://192.168.1.61:1433;DatabaseName=gaclTest"44 username="sa" 45 password="p@ssw0rd"46 maxActive="50"47 maxWait="10000"48 removeabandoned="true"49 removeabandonedtimeout="60"50 logabandoned="false"51 filters="stat"/>52 </Context>
配置项中指定了各个参数后,在连接池内部是这么使用这些参数的。数据库连接池在初始化的时候会创建initialSize个连接,当有数据库操作时,会从池中取出一个连接。如果当前池中正在使用的连接数等于maxActive,则会等待一段时间,等待其他操作释放掉某一个连接,如果这个等待时间超过了maxWait,则会报错;如果当前正在使用的连接数没有达到maxActive,则判断当前是否空闲连接,如果有则直接使用空闲连接,如果没有则新建立一个连接。在连接使用完毕后,不是将其物理连接关闭,而是将其放入池中等待其他操作复用。同时连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。有些数据库连接的时候有超时限制(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个testWhileIdle参数为true,可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的Connection对象是可用的。当然,为了保证绝对的可用性,你也可以使用testOnBorrow为true(即在获取Connection对象时检测其可用性), 不过这样会影响性能。
2.3、在web.xml引用JDNI数据源
在web.xml文件中加入如下的配置引用JNDI数据源
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <welcome-file-list> 8 <welcome-file>index.jsp</welcome-file> 9 </welcome-file-list>10 11 <!-- 12 JNDI配置的资源引用:13 • res-ref-name:表示引用资源的名称14 • res-type:此资源对应的类型为javax.sql.DataSource15 • res-auth:容器授权管理16 -->17 <!--Oracle数据库JNDI数据源引用 -->18 <resource-ref>19 <description>Oracle DB Connection</description>20 <res-ref-name>jdbc/OracleDataSource</res-ref-name>21 <res-type>javax.sql.DataSource</res-type>22 <res-auth>Container</res-auth>23 </resource-ref>24 25 <!--MySQL数据库JNDI数据 -->26 <resource-ref>27 <description>MySQL DB Connection</description>28 <res-ref-name>jdbc/MysqlDataSource</res-ref-name>29 <res-type>javax.sql.DataSource</res-type>30 <res-auth>Container</res-auth>31 </resource-ref>32 33 <!--SQLServer数据库JNDI数据源引用 -->34 <resource-ref>35 <description>SQLServer DB Connection</description>36 <res-ref-name>jdbc/SqlServerDataSource</res-ref-name>37 <res-type>javax.sql.DataSource</res-type>38 <res-auth>Container</res-auth>39 </resource-ref>40 </web-app>
2.4、测试JNDI数据源
部署Druid_JNDI_Config Web应用到Tomcat服务器测试JNDI数据源,如下图所示:
部署到tomcat服务器的webapps目录之后,tomcat服务器就会自动在\conf\Catalina\localhost目录下生成一个Druid_JNDI_Config.xml文件,如下图所示:
Druid_JNDI_Config.xml文件中的内容就是我们在META-INF目录的context.xml文件中配置的那些内容。
jsp测试页面如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%--引入JSTL标签库 --%> 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> 5 <!DOCTYPE HTML> 6 <html> 7 <head> 8 <title>DRUID配置JNDI数据源连接测试</title> 9 </head>10 11 <body>12 <h3>针对MySQL数据库JNDI数据源测试</h3>13 <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>14 <sql:query var="rs" dataSource="jdbc/MysqlDataSource">15 <%--MySQL JNDI数据源测试 SQL--%>16 select * from lead_oams_applications17 </sql:query>18 <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>19 <c:forEach var="row" items="${rs.rows}">20 <%--${row.字段名}获取字段的值--%>21 ${row.resourceid}---${row.app_name}<br/>22 </c:forEach>23 <hr/>24 <h3>针对Oracle数据库JNDI数据源测试</h3>25 <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>26 <sql:query var="rs" dataSource="jdbc/OracleDataSource">27 <%--Oracle JNDI数据源测试 SQL--%>28 SELECT * FROM LEAD_OAMS_DBSOURCES29 </sql:query>30 <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>31 <c:forEach var="row" items="${rs.rows}">32 <%--${row.字段名}获取字段的值--%>33 ${row.RESOURCEID}---${row.DBSOURCE_NAME}---${row.DBSOURCE_TYPE}<br/>34 </c:forEach>35 <hr/>36 <h3>SQLServer JNDI数据源测试</h3>37 <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>38 <sql:query var="rs" dataSource="jdbc/SqlServerDataSource">39 <%--SQLServer JNDI数据源测试 SQL--%>40 select * from t_demo41 </sql:query>42 <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>