JNDI详细配置及使用

来源:互联网 发布:dbc2000 传奇数据库表 编辑:程序博客网 时间:2024/06/15 18:51

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.DataSource18   |- 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"/>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&amp;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 

  1. <Context docBase="WebApp" path="/WebApp" reloadable="true">  
  2.     <ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" />  
  3. </Context> 

2.单个应用独享数据源

找到Tomcat的server.xml找到工程的Context节点,添加一个私有数据源


  1. <Context docBase="WebApp" path="/WebApp" reloadable="true" source="org.eclipse.jst.jee.server:WebApp">  
  2. <Resource  
  3.     name="jdbc/mysql"   
  4.     scope="Shareable"   
  5.     type="javax.sql.DataSource"  
  6.     factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"  
  7.     url="jdbc:mysql://localhost:3306/test"  
  8.     driverClassName ="com.mysql.jdbc.Driver"  
  9.     username="root"  
  10.     password="root"  
  11. />  
  12. </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>

 

Xml代码  收藏代码
  1. <Context>  
  2.     <ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" />  
  3.    <WatchedResource>WEB-INF/web.xml</WatchedResource>  
  4. <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.DataSource15   • 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>24   
 <!--
25 <!--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取得一个连接
    • 操作数据库
    • 关闭数据库,关闭的时候是将连接放回到连接池之中

  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数据源的配置


Xml代码  收藏代码
  1. <Resource name="jdbc/mysql_c3p0" scope="Shareable"  
  2.     type="com.mchange.v2.c3p0.ComboPooledDataSource"   
  3.     factory="org.apache.naming.factory.BeanFactory"  
  4.     jdbcUrl="jdbc:mysql://localhost:3306/test"
  5.    driverClass="com.mysql.jdbc.Driver"  
  6.     user="root"
  7.    password="root" /> 


本文参考文章:

http://blog.csdn.net/samjustin1/article/details/52265796

http://blog.csdn.net/dyllove98/article/details/7706218

0 0