如何在普通Java工程中配置jndi配置

Jndi Tomcat 配置 - 生亦何欢,死亦何求 - ITeye技术网站
博客分类:
Tomcat 5.5(以上版本)配置JNDI数据源
配置数据源,总的来说有两种思路,思路一是直接在&Context&中配置局部数据源,思路二是先配置全局数据源,然后再在&Context&应用中链接到全局数据源,又因为Tomcat中&Context&位置多样,具体我分为如下几种方法:
方法1、直接在&Context&中配置局部数据源,tomcat中%tomcat_home%\conf\ context.xml中的&Context&中添加数据源。即将第2步中的数据直接添加到&Context&节点下。已通过验证。
方法2、第2步 + 第6步,测试通过。
方法3、方法4、先配置全局数据源,然后再在&Context&应用中链接到全局数据源,在server.xml中的&GlobalNamingResources&元素中配置数据源(数据源配置见上文)成全局数据源,然后在&Context&元素链接到该资源。另外,&Context&位置可有多个,那么在&Context&元素链接到全局数据源的位置时,&Context&的位置可有两个如下:实现方式有:方法3-------第2步 + 第3步,联合实现,测试通过
方法4---------第2步 + 第7步,联合实现,测试通过
方法5:(直接配置的类型,这种方式最简单)就是第8步的操作即可,验证通过
1、(必不可少)先将JDBC驱动加入到tomcat6/lib目录下如果直接用JDBC访问数据库,可以把JDBC驱动程序拷贝到Web应用的WEB-INF/lib目录或者Tomcat安装目录下的common/lib目录下。    如果通过数据源访问数据库,由于数据源由Servlet容器创建并维护,所以必须把JDBC驱动程序拷贝到Tomcat安装目录下的common/lib目录下,确保Servlet容器能够访问驱动程序。
2、在tomcat的conf/server.xml中的&GlobalNamingResources&元素中添加如下内容:&!—连接sqlserver --&&Resource
name="jdbc/sqlservertest"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="45"
username="sa"
maxWait="180"
driverClassName="net.sourceforge.jtds.jdbc.Driver"
password="123456"
url="jdbc:jtds:sqlserver://localhost:1433/test"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
testOnReturn="true" testWhileIdle="true"/&
&!—连接mysql --&&Resource name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/wxl"
username="root"
password="root"
maxActive="100"
maxIdle="30"
maxWait="10000" /&以上配置了两个全局数据源,一个叫jdbc/sqlservertest,是SQLServer2000的,一个叫:jdbc/mysql,是连接mysql的
参数说明:driveClassName:JDBC驱动类的完整的名称; maxActive:同时能够从连接池中被分配的可用实例的最大数; maxIdle:可以同时闲置在连接池中的连接的最大数; maxWait:最大超时时间,以毫秒计; password:用户密码; url:到JDBC的URL连接; user:用户名称; validationQuery:用来查询池中空闲的连接。
3、在tomcat的conf/ context.xml中的&Context&元素中添加如下内容:&ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" /&
4、补充一步(可有可无)在应用发布目录下\web-inf\web.xml文件中配置该数据源的引用&resource-ref&元素(注意位置,一般放在&web-app&根元素中最后面,详细参考dtd文件)。我在如上所示环境实际测试时发现,此文件可有可无。(确实是这样的)有的文章说配置了可能会更稳定,未及考证。如下:&resource-ref&
&description&DB Connection&/description&
&res-ref-name&jdbc/mysql&/res-ref-name&
&res-type&javax.sql.DataSource&/res-type&
&res-auth&Container&/res-auth&&/resource-ref&这一步的目的就是告诉tomcat如何连接数据库
5、获得连接&%@ page language="java" import="java.util.*,java.sql.Connection,javax.sql.DataSource, javax.naming.InitialContext" pageEncoding="utf-8"%&
&html&&head&&%
InitialContext ctx = new InitialContext();
String strLookup = "java:comp/env/jdbc/mysql";
DataSource ds =(DataSource) ctx.lookup(strLookup);
Connection con = ds.getConnection();
if (con != null){
System.out.print("success");
System.out.print("failure");
搞得我好辛苦啊 &br&&/body&&/html&补充一个常见错误:上述代码在J2EE服务器环境下工作得很好,但是在main()中就会报错:javax.naming.NoInitialContextException:
之所以有NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数,在服务器环境下,服务器启动时就把这些参数放到System.properties中。所以可以通过以下方法解决:Hashtable env = new Hashtable();env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");env.put(Context.PROVIDER_URL,"t3://localhost:7001");InitialContext ctx = new InitialContext(env);
或System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");System.setProperty(Context.PROVIDER_URL, "rmi://localhost:3306/wxl");System.setProperty(Context.SECURITY_PRINCIPAL, "root");System.setProperty(Context.SECURITY_CREDENTIALS, "root");
以上代码建议改为在配置文件中配置java.naming.factory.initial=weblogic.jndi.WLInitialContextFactoryjava.naming.provider.url=rmi://localhost:3306/testjava.naming.security.principal=root #用户名java.naming.security.credentials=root #密码这里要正常运行,肯定要导入weblogic.jndi.WLInitialContextFactory相关的包了。
然后将做个web工程发布到tomcat下;我用了两种方式发布:一种是war包的方式,一种是在server.xml中添加一个Context;下面分别说说两种发布方式的区别:6、war包方式:如果要用war包方式发布web应用程序,又要使用JNDI数据源的话,要在你的web工程的META-INF文件夹下新建context.xml文件,内容如下:
&?xml version="1.0" encoding="UTF-8"?&&Context&
&ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource"/&&/Context&global:就是tomcat的server.xml中配置的全局数据源名称。name:就是你的web项目中要用的那个那个数据源的名称:也就是jsp中写的那个mysqltest2名称;
7、在server.xml中添加context的方式:直接在server.xml中的&Host&&/Host&中添加如下内容:
&Context path="/Pool" docBase="E:/apache-tomcat-6.0.16/webapps/Pool" reloadable="true"&
&ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" /&
&/Context&其中:path为应用名
docBase 为应用路径
8、只需在tomcat_home\webapps\myapps\META-INF\context.xml中增加:&?xml version='1.0' encoding='utf-8'?&&Context&&Resource name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/wxl"
username="root"
password="root"
maxActive="100"
maxIdle="30"
maxWait="10000" /&&/Context&
说明:这种配置需要告诉tomcat resource的内容,resource应用于什么地方
//========================================================常见错误:1,Name jdbc is not bound in this Context2,Cannot create JDBC driver of class ” for connect URL ‘null’ conf localhost原因:大多数是因为配置了全局的resource,但没有link造成的。解决:加入link就行了。分析:看到上边这么多方法,是否感觉眼花缭乱,其实不要死记配置,按照原理分析一下就好了。你需要的是告诉tomcat哪个应用如何连接数据库。类型一的方式对应一个应用单独使用这个配置的情况就是直接告诉tomcat”应用名” “连接数据库需要的参数”
类型二的方式对应多个应用共享一个配置的情况这样先配置server.xml告诉tomcat全局范围的”连接数据库需要的参数”然后映射,映射的时候1,如果不知道”app name(应用名)”就只需要通过文件名来传递这个信息2,如果”app name”都知道就只需要加入映射的内容3,如果要配置成全局公用的,就不需要”app name”,本身放在tomcat的context.xml中最后再次提醒一下:所有的配置必须放在&context&&/context&之间
&!--EndFragment--&
浏览: 325188 次
来自: 上海
果然有高人翻译啊,谢了~
字符串都不用单引号引着吗?发表评论:
TA的最新馆藏Tomact datasource JNDI 详解 - 隔壁老王 - ITeye技术网站
博客分类:
一、数据源简介:
***********************************************************************************
在Java语言中,DataSource对象就是一个代表数据源实体的对象。一个数据源就是一个用来存储数据的工具,它可以是复杂的大型企业级数据库,也可以是简单得只有行和列的文件。数据源可以位于在服务器端,也可以位于客服端。
应用程序通过一个连接来访问数据源,那么一个DataSource对象就是用于提供连接数据源的工具。DataSource接口提供了两个方法用于建立和数据源的连接
使用DataSource对象建立和数据库的连接比起使用DriverManager接口更加高效,虽然两者的使用范围都很相似,并且都提供了方法用于建立和数据库的连接,设置连接的最大超时时间,获取流、登录。
&&
但两者之间的区别更加明显。和DriverManager不同,一个DataSource对象能够识别和描述它所代表的数据源的属性,而且DataSource对象的工作和JNDI(Javatm Naming and Directory Interfaceti)具有密切的关系,DataSource的建立、发布、独立于应用程序的管理都依靠JNDI技术。
&&&
在JDBC2.0或JDBC3.0中,所有的数据库驱动程序提供商必须提供一个实现了DataSource接口的类,要使用数据源必须首先在JNDI中注册该数据源对象。
如果在JNDI中注册了数据源对象,将会比起使用DriverManager来具有两个方面的优势:
首先程序不需要像使用DriverManager一样对加载的数据库驱动程序信息进行硬编码,程序员可以选择先在JNDI中注册这个数据源对象,然后在程序中使用一个逻辑名称来引用它,JNDI会自动根据你给出的名称找到与这个名称绑定的DataSource对象。然后就可以使用这个DataSource对象来建立和具体数据库的连接了。
其次,使用实现了DataSource接口的类所具有的第二个优势体现在连接池和分布式事务上。连接池通过对连接的复用而不是新建一个物理连接来显著地提高程序的效率。从而适用于任务繁忙、负担繁重的企业级分布式事务。
***********************************************************************************
二、JNDI简介:
***********************************************************************************
JNDI是用于向Java程序提供目录和命名功能的API。它被设计成独立于特定的目录服务,所以各种各样的目录都可以通过相同的方式进行访问。
可以简单地把JNDI理解为一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和惟一的名字绑定。外部程序可以通过名字来获取对某个对象的引用。
在Intranets(企业内部网)和Internates(互联网)中目录服务(Directory service)扮演了一个非常重要的角色,它能够在众多的用户、机器、网络、服务、应用程序中访问各种各样的信息。目录服务提供了一系列的命名措施,用人类可以理解的命名方式来刻画各种各样的实体之间的关系
一个企业式计算环境(computing environment)通常是由若干代表不同部分的命名复合而成。比如在一个企业级环境中DNS(Domain Name System)通常被当成顶层的命名方案(top-level namein facility)区分不同的部门或组织。而这些部门或组织自己又可以使用诸如LADP或NDS的目录服务
从用户的角度来看,这些都是由不同的命名方案构成的复合名称。URL就是一个很典型的例子,它由多个命名方案构成。使用目录服务的应用程序必须支持这种复合构成方式
使用目录服务API的Java开发人员获得的好处不仅在于API独立于特定的目录或命名服务,而且可以通过多层的命名方案无缝访问(seamless acess)目录对象。实际上,任何的应用程序都可以将自身的对象和特定的命名绑定起来,这种功能可以使到任何的Java程序查找和获取任何类型的对象
终端用户可以方便地使用逻辑名称从而轻易地在网络上查找和识别各种不同的对象,目录服务的开发人员可以使用API方便地在不同的客服端之间切换而不需要作任何更改
***********************************************************************************
三、数据源和连接池的关系:
***********************************************************************************
JDBC2.0提供了javax.sql.DataSource接口,它负责建立与数据库的连接,在应用程序访问数据库时不需要编写连接数据库的代码,可以直接从数据源获得数据库连接。
 
在DataSource中事先建立了多个数据库连接,这些数据库连接保存在连接池(Connect Pool)中。Java程序访问数据库时,只需要从连接池中取出空闲状态的数据库连接;当程序访问数据库结束,再将数据库连接放回连接池。
***********************************************************************************
四、数据源和JNDI的关系:
***********************************************************************************
DataSource对象是由Tomcat提供的,因此不能在程序中采用创建一个实例的方式来生产DataSource对象,而需要采用Java的另一个技术JNDI,来获得DataSource对象的引用。
Tomcat把DataSource作为一种可以配置的JNDI资源来处理。生成DataSource对象的工厂为mons.dbcp.BasicDataSourceFactory。
在javax.naming包中提供了Context接口,该接口提供了将对象和名字绑定,以及通过名字检索对象的方法。Context中的主要方法有:
bind(String name,Object object):将对象与一个名字绑定
lookup(String name):返回与指定的名字绑定的对象
***********************************************************************************
五、Tomcat中数据源的配置:
***********************************************************************************
数据源的配置涉及修改server.xml和web.xml,在server.xml中加入定义数据源的元素&Resource&,在web.xml加入&resource-ref&元素,声明该Web应用所引用的数据
A.在server.xml中加入&Resource&元素:&Resource&元素用来定义JNDI Resource。
  
属性&&& 描述
name&&& 指定Resource的JNDI名字
auth&&& 指定管理Resource的Manager,它有两个可选值:Container、Application
type&&& 指定Resource所属的Java类名
&Resource name = "jdbc/BookDb" 
auth = "Container" 
&&&&    type = "javax.sql.DataSource" /&
B.在&Resource&元素中加入&ResourceParams&元素:&ResourceParams&元素用来指定各种参数值
  
属性&&& 描述
factory&&& 指定生成的DataResource的factory类名
maxActive&&& 指定数据库连接池中处于活动状态的最大连接数目,0表示不受限制
maxIdle&&& 指定数据库连接池中处于空闲状态的最大连接数目,0表示不受限制
maxWait&&& 指定连接池中连接处于空闲状态的最长时间,超过会抛出异常,-1表示无限
username&&& 指定连接数据库的用户名
password&&& 指定连接数据库的口令
driverClassName&&& 指定连接数据库的JDBC驱动程序
url&&&&&&&&&&&& 指定连接数据库的URL
&& &ResourceParams name = "jdbc/BookDb"&
&&& &parameter&
&&&&&& &name&factory&/name&
&&&&&& &value&mons.dbcp.BasicDataSourceFactory&/value&
&&& &/parameter&
&&& &parameter&
&&&&&& &name&maxActive&/name&
&&&&&& &value&100&/value&
&&& &/parameter&
&&& &parameter&
&&&&&& &name&maxIdle&/name&
&&&&&& &value&30&/value&
&&& &/parameter&
&&& &parameter&
&&&&&& &name&maxWait&/name&
&&&&&& &value&10000&/value&
&&& &/parameter&
&&& &parameter&
&&&&&& &name&username&/name&
&&&&&& &value&user&/value&
&&& &/parameter&
&&& &parameter&
&&&&&& &name&password&/name&
&&&&&& &value&1234&/value&
&&& &/parameter&&
&&& &parameter&
&&&&&& &name&driverClassName&/name&
&&&&&& &value&com.mysql.jdbc.Driver&/value&
&&& &/parameter&
&&& &parameter&
&&&&&& &name&url&/name&
&&&&&& &value&jdbc:mysql//localhost:3306/BookDb?autoReconnect=true&/value&
&&& &/parameter&&
&/ResourceParams&
========================================================================
此处设置是针对tomcat5.5以前的版本!!!切记之。如果是5.5版本,需要如下修改
&Resource name = "jdbc/OracleDb" auth="Container"
&&& type ="javax.sql.DataSource"
&&& username ="jh" password ="1"
&&& driverClassName ="oracle.jdbc.driver.OracleDriver"
&&& url="jdbc:oracle:thin:@localhost:1521:XE"
&&& maxActive ="10"
&&& maxIdle="2" /&
=====================================================================
C.在web.xml中加入&resource-ref&元素:&resource-ref&元素表示在Web应用中引用JNDI资源
  
属性&&&&&&&&&&&&&&&&& 描述
description&&& 对所引用的资源的说明
res-ref-name&&& 指定所引用资源的JNDI名字,与&Resource&元素中的name属性对应
res-type&&&&&&&&&&&& 指定所引用资源的类名字,与&Resource&元素中的type属性对应
res-auth&&&&&&&&&&&& 指定所引用资源的Manager,与&Resource&元素中的auth属性对应
***********************************************************************************
六、在Web应用中使用数据源:
***********************************************************************************
javax.naming.Context提供了查找JNDI Resource的接口,可以通过三个步骤来使用数据源对象:
A.获得对数据源的引用:
    Context ctx = new InitalContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/BookDb");
&&& B.获得数据库连接对象:
&&&&&&& Connection con = ds.getConnection();
  
&&& C.返回数据库连接到连接池:
&&&&&&& con.close();
在连接池中使用close()方法和在非连接池中使用close()方法的区别是:前者仅仅是把数据库连接对象返回到数据库连接池中,是连接对象又恢复到空闲状态,而非关闭数据库连接,而后者将直接关闭和数据库的连接
***********************************************************************************
七、发布使用数据源的Web应用:
***********************************************************************************
  如果直接同JDBC访问数据库,可以把JDBC驱动程序拷贝到Web应用的WEB-INF/lib目录或者Tomcat安装目录下的common/lib目录下。
  
  如果通过数据源访问数据库,由于数据源由Servlet容器创建并维护,所以必须把JDBC驱动程序拷贝到Tomcat安装目录下的common/lib目录下,确保Servlet容器能够访问驱动程序。
=================================================================
转自:http://blog.csdn.net/timesongjie/article/details/7645845
浏览: 2596634 次
来自: 北京
2、采用文件流输出的方式下载
这一段里啥玩意啊,全是错误,不 ...
a54409 写道全tm错的骚年,我运行是对的。看看是不是插件 ...
[color=olive][color=cyan][size= ...birt如何使用jndi?-java-电脑编程网birt如何使用jndi?作者:佚名 和相关&&
1. Install Your JDBC Driver Make an appropriate JDBC driver available to both Tomcat internal classes and to your web application. This is most easily accomplished by installing the driver's JAR file(s) into the $CATALINA_HOME/common/lib directory.
2. Declare Your Resource Requirements
In the webapps/WebViewerExample/WEB-INF/web.xml file, add the following entry to setup your JNDI service:
&resource-ref&
&description&Resource reference to a factory for .sql.Connection&/description&
&res-ref-name&jdbc/MySqlDB&/res-ref-name&
&res-type&x.sql.DataSource&/res-type&
&res-auth&Container&/res-auth&
&/resource-ref&
where MySqlDB is your JNDI name.
3. Configure Tomcat's Resource Factory
配置数据源请参照
http://www./thread.shtml?forumId=27&topicId=22207
To configure Tomcat's resource factory, add an element like this to the webapps/WebViewerExample/META-INF/context.xml file in the web application.
&Resource name="jdbc/MySqlDB"
auth="Container"
type="javax.sql.DataSource"
maxActive="5" maxIdle="-1" maxWait="10000"
username="myuser" password="mypassword"
driverClassName="com..jdbc.Driver"
url="jdbc:://localhost:3306/classicmodels"
description="MySQL Sfdata DB"/&
4. Set the JNDI property in your report to: java:comp/env/jdbc/MySqlDB
500)this.width=500;" border=0>
&
注意:1、开发阶段配置jdbc,直接链接。
2、发布后,如果jdbc和jndi都配置了,会首先寻找jndi。
What is the precedence when both JDBC URL and JNDI name are specified? &If your report design contains a JDBC data source defined with both JDBC Driver URL and JNDI name, then JNDI service will be used first and JDBC driver will be used as fallback. The username and password properties, if specified, are used in both cases. When you need to ensure that JNDI service is really used, increase logging level of BIRT in case of JDBC fallback you will see JNDI lookup errors in the logs.
相关资料:|||||||birt如何使用jndi?来源网络,如有侵权请告知,即处理!编程Tags:                &                    

我要回帖

更多关于 java jndi配置 的文章

 

随机推荐