jndi配置属性的含义(转)

有关tomcat配置jndi的一些简单介绍:

先说流程:(根据tomcat有关jndi的文档,这个文档应该是针对单个项目配置,下面有比较好的可以配置全局使用的例子)

1.先安装jdbc驱动,这一步很简单,只需将对应数据库驱动放到tomcat对应common/lib目录下就行了;

2.修改对应项目的WEB-INF/web.xml文件,用来声明你的jndi名字以供你的项目使用:

在你的web.xml文件中加入如下代码:

<resource-ref></resource-ref>
  <description></description>
<resource-ref>
  <description>
    Resource reference to a factory for java.sql.Connection
    instances that may be used for talking to a particular
    database that is configured in the server.xml file.
  </description>
  <res-ref-name>
    jdbc/EmployeeDB
  </res-ref-name>
  <res-type>
    javax.sql.DataSource
  </res-type>
  <res-auth>
    Container
  </res-auth>
</resource-ref>

3.对应java代码中获得连接方法:(代码摘要)

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)
  envCtx.lookup("jdbc/EmployeeDB");

Connection conn = ds.getConnection();
... use this connection to access the database ...
conn.close();

4.配置你的tomcat资源工厂:

在WEB-INF目录下新建文件context.xml,内容如下:

<context></context>
<Context ...>
  ...
  <Resource name="jdbc/EmployeeDB" auth="Container"
            type="javax.sql.DataSource" username="dbusername" password="dbpassword"
            driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database"
            maxActive="8" maxIdle="4"/>
  ...
</Context>
以下摘自tomcat关于jndi的官方文档:
所有安装tomcat的可以在tomcat目录下找到对应文章,路径如下:
D:/apache-tomcat-5.5.25/webapps/tomcat-docs/jndi-resources-howto.html
红字标出的是tomcat解压目录,大家改成自己对应目录就可以了
关于context.xml中对应字段解释地址如下:
http://commons.apache.org/dbcp/configuration.html
或者大家看后面我引用别人的例子也行,里面有详细的中文介绍

以下是网上找的一篇文章,感觉写的也很好,抄过来供大家看看:

数据源:

JDBC2.0提供了javax.sql.DataSource的接口,负责与数据库建立连接,实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。Dataource中事先建立了多个数据库连接,这些数据库连接保持在数据库连接池>数据库连接池中,当程序访问数据库时,只需要从连接池从取出空闲的连接,访问数据库结束,在将这些连接归还给连接池。DataSource对象由容器(Tomcat)提供,不能使用创建实例的方法来生成 DataSource对象,要采用JAVA的JNDI(Java Nameing and Directory Interface,java命名和目录接口)来获得DataSource对象的引用。(另有一种说法:“其实从技术上来说,数据源连接方式是不需要目录服务的,我们同样可以通过序列化数据源对象直接访问文件系统。这点是需要明确的。”感兴趣的朋友可以试试。)JNDI是一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和唯一的名字相绑定。程序中可以通过这个名字来获得对象的引用。Tomcat把DataSource作为一种可配置的 JNDI资源来处理,生成DataSource对象的工厂为 org.apache.comm.ons.dbcp.BasicDataSourceFactory。

 

配置数据源:

配置数据源其实相当简单:

首先在server.xml中加入<resource></resource>元素,打开server.xml,在<context></context>中加入以下代码(以oracle为例):

 

 

<resource type="javax.sql.DataSource" auth="Container" name="jdbc/ JNDI名字"></resource>

<resourceparams name="jdbc/JNDI名字"></resourceparams>

<parameter></parameter>

<name></name>factory
 
<value></value>org.apache.commons.dbcp.BasicDataSourceFactory



<parameter></parameter>

<name></name>maxActive

<value></value>100



<parameter></parameter>
 
<name></name>maxIdle
 
<value></value>30



<parameter></parameter>

<name></name>maxWait
 
<value></value>10000



<parameter></parameter>
 
<name></name>username

<value></value>用户名



<parameter></parameter>

<name></name>password

<value></value>密码



<parameter></parameter>

<name></name>driverClassName

<value></value>oracle.jdbc.driver.OracleDriver



<parameter></parameter>

<name></name>url
 
<value></value>jdbc:oracle:thin:@ip:端口:sid



 

<resource></resource>元素的属性如下:

 

属性描述
name指定Resource的JNDI的名字
auth指定管理Resource的Manager,由两个可选值:Container和Application。Container表示由容器来创建和管理 Resource,Application表示由WEB应用来创建和管理Resource。如果在web application deployment descriptor中使用<resource-ref></resource-ref>,这个属性是必需的,如果使用<resource-env-ref></resource-env-ref>,这个属性是可选的。
type指定Resource所属的java类名

 

<resourceparams></resourceparams>元素的属性如下:

 

 

属性描述
name指定ResourceParams的JNDI的名字,必须和Resource的name保持一致
factory指定生成DataSource对象的factory的类名
maxActive指定数据库连接池>数据库连接池中处于活动状态的数据库连接最大数目,0表示不受限制
maxIdle指定数据库连接池>数据库连接池中处于空闲状态的数据库连接的最大数目,0表示不受限制
maxWait指定数据库连接池>数据库连接池中的数据库连接处于空闲状态的最长时间(单位为毫秒),超过这一事件,将会抛出异常。-1表示可以无限期等待。
username指定连接数据库的用户名
password指定连接数据库的密码
driverClassName指定连接数据库的JDBC驱动程序
url指定连接数据库的URL

 

其他文章说以上配置就OK了,对于web.xml的配置可有可无,其实不是这样子的。如果在web应用中访问了由Servlet容器管理的某个 JNDI Resource,则必须在web.xml中声明对这个JNDI Resource的引用。表示资源引用的元素为<resource-ref></resource-ref>,该元素加在<wepapp></wepapp>中。

 

 

<resource-ref></resource-ref>

<descryiption></descryiption>DB Connection

<res-ref-name></res-ref-name>jdbc/JNDI名字

<res-type></res-type>javax.sql.DataSource

<res-auth></res-auth>Container

 

<resource-ref></resource-ref>元素的属性如下:

 

 

属性描述
description对所引用的资源的说明
res-ref-name指定所引用资源的JNDI名字,与<resource></resource>元素中的name属性保持一致
res-type指定所引用资源的类名字,与<resource></resource>元素中的type属性保持一致
res-auth指定所引用资源的Manager,与<resource></resource>元素中的auth属性保持一致

 

到这里,数据源就已经配置成功了。但是我在测试的时候除了一点小麻烦,主要原因是对DataSource的概念没搞清楚。我是这么测试的,写一个测试类,然后在eclipse中进行junit测试,捕获的异常为:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial。

同样的代码在JSP文件中正常运行,后来翻了一些资料,终于找到了问题的所在了。原来DataSource是由容器(TOMCAT)提供的,所以我的测试会抛出异常。为了再次验证想法是否正确,在jsp文件中import刚才抛出异常的类,在进行连接数据库,结果一切正常。

下面的例子是实际应用中使用DataSource,在jsp文件中连接oracle。

 

 























 

另:tomcat5.5的配制方法为:

               maxActive="100" maxIdle="30" maxWait="10000"
               username="用户名" password="密码" driverClassName="oracle.jdbc.driver.OracleDriver"
               url="jdbc:oracle:thin:@ip:端口:sid"/>


http://www.niftyadmin.cn/n/1053171.html

相关文章

Setup Kubernetes on a Raspberry Pi Cluster easily the official way!

转自 Kubernetes shares the pole position with Docker in the category “orchestration solutions for Raspberry Pi cluster”. However it’s setup process has been elaborate – until v1.4 with the kubeadm announcement. With that effort, Kubernetes changed thi…

博客园北京俱乐部第三次活动杂记

今天下午参加了博客园北京俱乐部第三次活动&#xff0c;记录一下感想。 下午我早早就到了现代大厦&#xff0c;却忘了会议室在第几层&#xff0c;碰巧微软又占了好几层&#xff0c;只好一层一层的找 &#xff1a;&#xff08;。由于今天我是主持&#xff0c;所以先和Terry大概讨…

XML入门(一)

xmlExtensible Markup Language:一种可扩展的标记语言&#xff0c;编程者自由度高。。。。 1.标记语言。就是用来给文本添加标记的语言, 就数据本身的信息对数据进行编码的方法。如&#xff1a;以前学的HTML&#xff0c;它是将内容和显示方式结合在一起的一种语言&#xff0c;在…

不等式恒成立求字母范围

1、$f(x)(1-x^{2})e^{x}$&#xff0c;当x≥0时&#xff0c;f(x)≤ax1恒成立&#xff0c;求a的取值范围 ${\color{Teal}{法一:分离参数}}$ $$f(x)≤ax1$$ $$(1-x^{2})e^{x}≤ax1$$ 即 $$a≥\frac{(1-x^{2})e^{x}-1}{x}$$ 令$$g(x)\frac{(1-x^{2})e^{x}-1}{x}$$ 即求a≥g(x)max对…

关于方法中的状态码表示什么

假如状态码为statusCode 1、statusCode > 0 表示成功的影响了多少条记录 2、statusCode 0表示没有做操作 3、statusCode < 0表示操作失败

Java之设计模式

简单工厂模式 工厂方法模式 抽象工厂模式 工厂模式在开发中的运用 单例模式 原型模式 建造者模式 装饰模式 策略模式 观察者模式 享元模式 代理模式 外观模式 组合模式 桥接模式 适配器模式 解释器模式 中介者模式 职责链模式 迭代模式 模板方法模式 备忘录模式 访问者模式 状态…

程序设计学习与试验系统下载

http://www.jiaminsoft.com/ 转载于:https://www.cnblogs.com/sea-stream/p/10850946.html

反射获取类结构信息

代码如下&#xff1a; 1 package com.sina.demo;2 interface IMessageService{3 public void send();4 }5 interface IChannel{6 public boolean connect();7 }8 abstract class AbstractBase{}9 class Mail extends AbstractBase implements IMessageService,IChannel…