- 浏览: 121857 次
- 来自: ...
最近访客 更多访客>>
文章分类
最新评论
-
dwangel:
给messageSource设置属性
<property ...
Spring i18n的better practice(相对于appfuse) -
dwangel:
spring 的message tag有一个属性text,可以 ...
Spring i18n的better practice(相对于appfuse) -
sn201:
awk高级篇
有问题啊!有问题!有问题!有问题!有问题!
i ...
awk文本处理总结(入门,中级,高级) -
happy_javaboy:
...
Log4j日志管理系统简单使用说明
最近写书,写到JNDI,到处查资料,发现所有的中文资料都对JNDI解释一通,配置代码也是copy的,调了半天也没调通,最后到SUN的网站参考了一下他的JNDI tutorial,终于基本上彻底明白了
和多数java服务一样,SUN对JNDI也只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现:
private static Object jndiLookup() throws Exception {
InitialContext ctx = new InitialContext();
return ctx.lookup("java:comp/env/systemStartTime");
}
上述代码在J2EE服务器环境下工作得很好,但是在main()中就会报一个NoInitialContextException,许多文章会说你创建InitialContext的时候还要传一个Hashtable或者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);
这个在WebLogic环境下是对的,但是换到JBoss呢?再用JBoss的例子?
其实之所以有NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数,在服务器环境下,服务器启动时就把这些参数放到System.properties中了,于是直接new InitialContext()就搞定了,不要搞env那么麻烦,搞了env你的代码还无法移植,弄不好管理员设置服务器用的不是标准端口还照样抛异常。
但是在单机环境下,可没有JNDI服务在运行,那就手动启动一个JNDI服务。我在JDK 5的rt.jar中一共找到了4种SUN自带的JNDI实现:
LDAP,CORBA,RMI,DNS。
这4种JNDI要正常运行还需要底层的相应服务。一般我们没有LDAP或CORBA服务器,也就无法启动这两种JNDI服务,DNS用于查域名的,以后再研究,唯一可以在main()中启动的就是基于RMI的JNDI服务。
现在我们就在main()中启动基于RMI的JNDI服务并且绑一个Date对象到JNDI上:
LocateRegistry.createRegistry(1099);
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
InitialContext ctx = new InitialContext();
class RemoteDate extends Date implements Remote {};
ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
ctx.close();
注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了,否则,你又得写Hashtable env = ...
在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就自己扩展一个。
其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问JNDI需要用户名和口令,这两个也要提供,不过一般用不上。
在后面的代码中查询就简单了:
InitialContext ctx = new InitialContext();
Date startTime = (Date) ctx.lookup("java:comp/env/systemStartTime");
在SUN的JNDI tutorial中的例子用的com.sun.jndi.fscontext.RefFSContextFactory类,但是我死活在JDK 5中没有找到这个类,也就是NoClassDefFoundError,他也不说用的哪个扩展包,我也懒得找了。
发表评论
-
Oracle性能调优-优化排序操作
2010-08-07 11:37 1149关于Oracle 10g性能方面,谈论最多的就是新的自动工作负 ... -
Oracle中的外连接简单介绍
2006-08-11 09:53 481在讲外连接之前,先举例介绍内连接,也就是一般的相等连接。 s ... -
SQLServer和Oracle常用函数对比
2006-08-11 09:55 341SQLServer和Oracle是大家经常用到的数据库,在此感 ... -
Oracle SQL 内置函数大全
2006-08-24 10:37 526... -
Oracle PL/SQL入门之慨述
2006-09-05 21:14 505一、PL/SQL出现的目的 结构化查询语言(Structur ... -
Oracle:PL/SQL 中如何使用Array
2006-09-18 20:41 617因为在PL/SQL 中并没有数 ... -
java高级编程:基于JNDI的应用开发
2006-10-02 18:08 573基于JNDI的应用开发 ... -
开源技术之Tomcat数据源配置总结
2006-10-06 14:55 579成功配置环境Tomcat5.0.28+ ... -
Java调用存储过程
2006-10-11 14:22 601摘要:本文阐述了怎 ... -
ORACLE SEQUENCE的简单介绍
2006-12-28 11:01 724在oracle中sequence就是所 ... -
oracle系统表查询
2007-07-30 17:03 547数据字典dict总是属于Ora ... -
JOB
2007-09-04 17:42 411var jobno number begin sys.db ... -
网络收集:PLSQL常用方法汇总
2007-10-18 14:03 706网络收集:PLSQL常用方法汇总 在SQLPLUS下,实现中- ... -
oracle pl/sql 创建同义词
2007-10-24 11:05 1287CREATE OR REPLACE Procedure Cre ... -
索引分析和比较
2007-11-21 10:20 714转自:http://tb.blog.csdn.net/Trac ... -
ORACLE索引与高性能SQL介绍
2007-11-21 15:05 462转自:http://blog.csdn.net/annicyb ... -
oracle动态游标的简单实现方法
2008-05-27 09:17 739下面就是例子程序 --明细表打印予处理 通用报表: pro ... -
Oracle触发器
2008-05-27 15:22 609是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用 ... -
Oracle体系结构之-Oracle中各种名称
2008-05-31 15:18 768一、数据库名 数据 ... -
数据库设计准则(第一、第二、第三范式说明)
2009-01-04 11:53 607I、关系数据库设计范式介绍 1.1 第一范式(1NF)无重复的 ...
相关推荐
JNDI配置原理详解 JNDI配置原理详解.doc
1.1 Apache Tomcat各版本 1.2 Apache Tomcat Versions 1.3 Java事务处理总结 1.4 JavaBean中使用JDBC...1.22 JNDI配置原理详解 1.23 JSF+Seam框架学习心得 1.24 java jdbc驱动的四种类型 1.25 resource-ref元素
124 8.5.2 拦截器的实现原理 124 8.5.3 Struts2的内置拦截器 124 8.5.4 拦截器的配置和使用 125 8.5.5 自定义拦截器 126 8.6 一个简单的Struts2应用 130 8.7 小结 140 第9章 JSF 141 9.1 JSF技术简介 141 9.1.1 JSF...
19.3 把SessionFactory与JNDI绑定 19.4 配置日志 19.5 使用XML格式的配置文件 19.6 小结 19.7 思考题 第20章 声明数据库事务 20.1 数据库事务的概念 20.2 声明事务边界的方式 20.3 在mysql.exe程序...
19.3 把SessionFactory与JNDI绑定 19.4 配置日志 19.5 使用XML格式的配置文件 19.6 小结 19.7 思考题 第20章 声明数据库事务 20.1 数据库事务的概念 20.2 声明事务边界的方式 20.3 在mysql.exe程序...
19.3 把SessionFactory与JNDI绑定 19.4 配置日志 19.5 使用XML格式的配置文件 19.6 小结 19.7 思考题 第20章 声明数据库事务 20.1 数据库事务的概念 20.2 声明事务边界的方式 20.3 在mysql.exe程序...
19.3 把SessionFactory与JNDI绑定 19.4 配置日志 19.5 使用XML格式的配置文件 19.6 小结 19.7 思考题 第20章 声明数据库事务 20.1 数据库事务的概念 20.2 声明事务边界的方式 20.3 在mysql.exe程序...
2.2.8. 工作原理............................................................................................ 14 2.2.9. 性能.................................................................................
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...
3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.1.1. 配置元数据 3.2.2. 实例化容器 3.2.2.1. 组成基于XML配置元数据 3.2.3. 多种bean 3.2.3.1. 命名bean 3.2.3.2. 实例化bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入...
2.4.2 JNDI绑定的SessionFactory 2.4.3 JMX服务部署 2.5 小结 第3章 领域模型和元数据 3.1 CaveatEmptor应用程序 3.1.1 分析业务领域 3.1.2 CaveatEmptor领域模型 3.2 实现领域模型 ...