JNDI在项目中使用很多,下面介绍一下JNDI在TOMCAT中的几种配置和使用
一.在tomcat中配置数据源
1.配置全局JNDI数据源,应用到单个应用
①找到Tomcat的server.xml中GlobalNamingResources节点,在节点下加一个全局数据源
oracle、mysql、sqlServer配置如下:
参照:http://blog.csdn.net/samjustin1/article/details/52265796
1 <!-- Global JNDI resources 2 Documentation at /docs/jndi-resources-howto.html 3 --> 4 <GlobalNamingResources> 5 <!-- Editable user database that can also be used by 6 UserDatabaseRealm to authenticate users 7 --> 8 <Resource name="UserDatabase" auth="Container" 9 type="org.apache.catalina.UserDatabase" 10 description="User database that can be updated and saved" 11 factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 12 pathname="conf/tomcat-users.xml" /> 13 <!-- 14 |- name:表示以后要查找的名称。通过此名称可以找到DataSource,此名称任意更换,但是程序中最终要查找的就是此名称, 15 为了不与其他的名称混淆,所以使用jdbc/oracle,现在配置的是一个jdbc的关于oracle的命名服务。 16 |- auth:由容器进行授权及管理,指的用户名和密码是否可以在容器上生效 17 |- type:此名称所代表的类型,现在为javax.sql.DataSource 18 |- maxActive:表示一个数据库在此服务器上所能打开的最大连接数 19 |- maxIdle:表示一个数据库在此服务器上维持的最小连接数 20 |- maxWait:最大等待时间。10000毫秒 21 |- username:数据库连接的用户名 22 |- password:数据库连接的密码 23 |- driverClassName:数据库连接的驱动程序 24 |- url:数据库连接的地址 25 --> 26 <!--配置Oracle数据库的JNDI数据源--> 27 <Resource 28 name="jdbc/oracle" 29 auth="Container" 30 type="javax.sql.DataSource" 31 maxActive="100" 32 maxIdle="30" 33 maxWait="10000" 34 username="scott" 35 password="orcl" 36 driverClassName="oracle.jdbc.driver.OracleDriver" 37 url="jdbc:oracle:thin:@192.168.1.229:1521:lead"/> 3839 <!--配置MySQL数据库的JNDI数据源-->40 <Resource 41 name="jdbc/mysql"42 auth="Container" 43 type="javax.sql.DataSource"44 maxActive="100" 45 maxIdle="30" 46 maxWait="10000"47 username="root" 48 password="root"49 driverClassName="com.mysql.jdbc.Driver"50 url="jdbc:mysql://192.168.1.144:3306/leadtest?useUnicode=true&characterEncoding=utf-8"/>51 52 <!--配置SQLServer数据库的JNDI数据源-->53 <Resource 54 name="jdbc/sqlserver"55 auth="Container" 56 type="javax.sql.DataSource"57 maxActive="100" 58 maxIdle="30" 59 maxWait="10000"60 username="sa" 61 password="p@ssw0rd"62 driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"63 url="jdbc:sqlserver://192.168.1.51:1433;DatabaseName=demo"/>64<!--
-->
65 </GlobalNamingResources>
②到要应用此JNDI数据源的工程Context节点,增加对全局数据源的引用ResourceLink
- <Context docBase="WebApp" path="/WebApp" reloadable="true">
- <ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" />
- </Context>
2.单个应用独享数据源
找到Tomcat的server.xml找到工程的Context节点,添加一个私有数据源
- <Context docBase="WebApp" path="/WebApp" reloadable="true" source="org.eclipse.jst.jee.server:WebApp">
- <Resource
- name="jdbc/mysql"
- scope="Shareable"
- type="javax.sql.DataSource"
- factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
- url="jdbc:mysql://localhost:3306/test"
- driverClassName ="com.mysql.jdbc.Driver"
- username="root"
- password="root"
- />
- </Context>
3.配置全局JNDI数据源,应用到所有Tomcat下部署的应用
①同第一种配置的第一步相同
找到Tomcat的server.xml中GlobalNamingResources节点,在节点下加一个全局数据源
4 <GlobalNamingResources>
8 <Resource name="UserDatabase" auth="Container"
9 type="org.apache.catalina.UserDatabase"
10 description="User database that can be updated and saved"
11 factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
12 pathname="conf/tomcat-users.xml" />
38
39 <!--配置MySQL数据库的JNDI数据源-->
40 <Resource
41 name="jdbc/mysql"
42 auth="Container"
43 type="javax.sql.DataSource"
44 maxActive="100"
45 maxIdle="30"
46 maxWait="10000"
47 username="root"
48 password="root"
49 driverClassName="com.mysql.jdbc.Driver"
50 url="jdbc:mysql://192.168.1.144:3306/leadtest?useUnicode=true&characterEncoding=utf-8"/>
65 </GlobalNamingResources>
②找到Tomcat的context.xml,在Context节点下加一个ResourceLink节点对第一步配置的数据源进行引用
这个XML配置文件的根节点就是<Context>
- <Context>
- <ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" />
- <WatchedResource>WEB-INF/web.xml</WatchedResource>
- <Context>
二、项目工程的web.xml文件中引用资源
数据源配置完成之后。下面在项目目录下的web.xml中做一下配置
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.DataSource 15 • res-auth:容器授权管理 16 --> 17 <!--Oracle数据库JNDI数据源引用 --> 18 <resource-ref> 19 <description>Oracle DB Connection</description> 20 <res-ref-name>oracleDataSource</res-ref-name> 21 <res-type>javax.sql.DataSource</res-type> 22 <res-auth>Container</res-auth> 23 </resource-ref> 2425 <!--MySQL数据库JNDI数据源引用 26 <resource-ref>27 <description>MySQL DB Connection</description>28 <res-ref-name>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>sqlserverDataSource</res-ref-name>37 <res-type>javax.sql.DataSource</res-type>38 <res-auth>Container</res-auth>39 </resource-ref>40<!--
-->
41 </web-app>
3、使用JNDI数据源获取数据库连接
配置完数据源连接池之后,就可以按照以下的步骤进行访问:
• 初始化名称查找上下文
• 通过JNDI名称找到DataSource
• 通过DataSource取得一个连接
• 操作数据库
• 关闭数据库,关闭的时候是将连接放回到连接池之中
• 通过JNDI名称找到DataSource
• 通过DataSource取得一个连接
• 操作数据库
• 关闭数据库,关闭的时候是将连接放回到连接池之中
jsp测试页面代码如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %> 3 4 <!DOCTYPE HTML> 5 <html> 6 <head> 7 <title>JNDI数据源测试</title> 8 </head> 9 10 <body> 11 <% 12 Connection connOracle = null; 13 try { 14 //1、初始化名称查找上下文 15 Context ctx = new InitialContext(); 16 //InitialContext ctx = new InitialContext();亦可 17 //2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟的是DataSource名 18 /* 19 DataSource名在web.xml文件中的<res-ref-name>oracleDataSource</res-ref-name>进行了配置 20 <!--Oracle数据库JNDI数据源引用 --> 21 <resource-ref> 22 <description>Oracle DB Connection</description> 23 <res-ref-name>oracleDataSource</res-ref-name> 24 <res-type>javax.sql.DataSource</res-type> 25 <res-auth>Container</res-auth> 26 </resource-ref> 27 */ 28 DataSource ds = (DataSource)ctx.lookup("java:comp/env/oracleDataSource"); 29 //3、通过DataSource取得一个连接 30 connOracle = ds.getConnection(); 31 out.println("Oracle Connection pool connected !!"); 32 //4、操作数据库 33 } catch (NamingException e) { 34 System.out.println(e.getMessage()); 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 } finally { 38 //5、关闭数据库,关闭的时候是将连接放回到连接池之中 39 connOracle.close(); 40 } 41 %> 42 <hr/> 106 </body> 107 </html>
参照:http://blog.csdn.net/samjustin1/article/details/52265796
我们知道Tomcat内置是dbcp数据库连接池,如果打算使用c3p0配置jndi数据源,可参考如下配置
C3P0数据源的配置
- <Resource name="jdbc/mysql_c3p0" scope="Shareable"
- type="com.mchange.v2.c3p0.ComboPooledDataSource"
- factory="org.apache.naming.factory.BeanFactory"
- jdbcUrl="jdbc:mysql://localhost:3306/test"
- driverClass="com.mysql.jdbc.Driver"
- user="root"
- password="root" />
本文参考文章: