JNDI 使用
学习Java,我们首先要掌握的就是十三种技术规范,我们接下来就一步一步的来学习。今天主要是讲讲JNDI。
一、理解JNDI的用途:
JNDI是用于访问不同的命名和目录服务的统一API接口。
二、那何时使用JNDI呢:
(1)JNDI是一种查找服务,用于查找:
Web应用环境变量
EJBs和它们的环境变量
通过DataSources的数据库连接池
JMS目标和连接工厂
其他服务
(2)不要将JNDI当作数据库使用
JNDI对象存储在内存中
访问JNDI对象与网络性能有关
接下来我们看一下JNDI树:
接下来我们理解理解图上的意思;我们看到Initial Context是JNDI树所有搜索的起点 ,那么如何重建Initial Context呢?
三、有两种途径,我们接下来一一讲解:
(1)、从服务器端对象连接到JNDI:
- //创建一个InitialContext
- context ctx=new InitialContext();
(2)、从任何一个地方连接到JNDI:
创建Environment对象:
- weblogic.jndi.Enviroment env=new
- weblogic.jndi.Enviroment();
填写Environment:
- env.setProviderur("t3://127.0.0.1:7001");//Weblogic
- //Server的位置
- env.setSecurityPrincipal("system");//安全信息
- env.setSecurityCredentials("passWord");
- //使用Environment对象创建InitialContext
- context ctx=env.getInitialContext();
创建Subcontext:
四、创建一个用于绑定对象的新的Subcontext:
- //创建Environment对象
- Contextctx = env.getInitialContext();//首先必须获得存在的Subcontext或InitialContext
- //填写Environment
- Contextsubcontext = ctx.createSubcontext("newSubcontext");//在当前的Context下创建新的Subcontext
- subcontext.rebind("boundObject",object);//创建一个对象
- subcontext.close();//当结束时经常关闭访问的资源
- ctx.close();
其他连接到JNDI的方法:
(1)使用‘Constant’Properties名和Hashtable类:
- Hashtableenv = new Hashtable();
- env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
- env.put(Context.PROVIDER_URL,"t3://localhost:7001");
- env.put(Context.SECURITY_PRINCIPAL,"system");
- env.put(Context.SECURITY_CRRDENTIALS,"PassWord");
- Contextctx = new InitalContext(env);
(2)使用‘Hardcoded’名和Properties类:
- Propertiesenv = new Properties();
- env.setProperty("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory");
- env.setProperty("java.naming.provider.url","t3://192.2.56.102:7001");
- env.setProperty("java.naming.security.principal","system");
- env.setProperty("java.naming.security.credentials","PassWrod");
- Contextctx = new InitialContext(env);
五、一些JNDI环境属性:
jndi.properties:
(1)、jndi.properties文件为所有的Initial Contexts设置默认的属性
(2)、jndi.properties文件的搜索次序
A、CLASSPATH
B、$JAVA_HOME/lib/
我们看一下jndi.properties示例:
- Java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
- Java.naming.provider.url=t3://localhost:7001
- Java.naming.security.principal=system
- Java.naming.security.credentials=password
- //使用这些默认值:
- Context ctx=new InitialContext();
六、从JNDI查找:
(1) Lookup()从JNDI树获得对象
(2) 通过lookup()返回的对象必须映射到它们合适的类型
- importjavax.naming.*;
- try{
- Contextic = new Context();
- Objectobj;
- obj= ic.lookup("javax.transaction.UserTransaction");
- UserTransactionut = (UserTransaction)obj;
- ut.begin();
- ...
- ic.close();
- }catch(NamingException e) {...}
七、远程绑定对象:
(1) 绑定到远程命名服务的对象必须是序列化的
(2) 访问命名服务时,对象是采用复制机制
这两句话很重要:
a、绑定的对象是序列化到命名服务器的
b、查找的对象是序列化到客户的
我们接下来看一个Binding示例:
- public static Context getInitialContext()throws NamingException {
- Environmentenv = new Environment();
- env.setProviderUrl("t3://localhost:7001");
- env.setSecurityPrincipal("system");
- env.setSecurityCredentials("weblogic");
- Contextcontext = env.getInitialContext();
- returncontext;
- }
- Context ctx = getInitialContext(); //获得initial context
- Bank myBank = new Bank(); //创建名为Bank的对象
- ctx.rebind("theBank", myBank); //把对象绑定到JNDI树
- ctx.close();
还有一个Un-Binding示例:
- public static Context getInitialContext()throws NamingException {
- Environmentenv = new Environment();
- env.setProviderUrl("http://localhost:7001");
- env.setSecurityPrincipal("system");
- env.setSecurityCredentials("weblogic");
- Contextcontext = env.getInitialContext();
- returncontext;
- }
- Context ctx = getInitialContext(); //获得initial context
- ctx.unbind("theBank"); //解除绑定到“theBank”的对象
- ctx.close();
八、可能的命名异常
当与JNDI交互时可能发生的例外i:
AuthenticationException认证
CommunicationException通信
InvalidNameException无效名称
NameNotFoundException名字没有找到
NoInitialContextException没有连接initialcontext
JNDI 使用的更多相关文章
- Java学习笔记之JNDI(六)
JNDI 是什么 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的 ...
- JNDI
这两天研究了一下 context.lookup("java:comp/env/XXX")和直接context.lookup("XXX")的区别 网上关于这两个的 ...
- Tomcat7.0+的JNDI问题
上次搭建spring+springmvc+mybatis框架时用的第三方连接池jar包,但是部署到tomcat中后访问没有问题,但是启动时报了个JNDI的错,我没用JNDI你给我报什么,fuck!把错 ...
- Tomcat下使用c3p0配置jndi数据源
下载c3p0包: 下载地址:https://sourceforge.net/projects/c3p0/files/?source=navbar 解压后得到包:c3p0-0.9.2.jar,mchan ...
- Spring配置JNDI和通过JNDI获取DataSource
一.SpringJNDI数据源配置信息 <bean id="dataSource" class="org.springframework.jndi.JndiObje ...
- 帆软报表FineReport中数据连接之Weblogic配置JNDI连接
1. 制作报表的原理 在帆软报表FineReport设计器中先用JDBC连接到数据库,建立数据库连接,然后用SQL或者其他方法创建数据集,使用数据集制作报表,然后把建立的数据库连接从JDBC连接改成J ...
- 帆软报表FineReport中数据连接之Jboss配置JNDI连接
使用sqlsever 2000数据库数据源来做实例讲解,帆软报表FineReport数据连接中Jboss配置JNDI大概的过程和WEBSPHERE以及WEBLOGIC基本相同,用JDBC连接数据库制作 ...
- 帆软报表FineReport中数据连接之Websphere配置JNDI连接
以oracle9i数据源制作的模板jndi.cpt为例来说明如何在FineReport中的Websphere配置JNDI连接.由于常用服务器的JNDI驱动过大,帆软报表FineReport中没有自带, ...
- 帆软报表FineReport中数据连接之Tomcat配置JNDI连接
1. 问题描述 在帆软报表FineReport中,通过JNDI方式定义数据连接,首先在Tomcat服务器配置好JNDI,然后在设计器中直接调用JNDI的名字,即可成功使用JNDI连接,连接步骤如下: ...
- mysql连接超时与jndi数据源配置
昨天有运营说添加活动不能用了,我就看了一下后台日志,发现访问数据库是报错: at java.lang.Thread.run(Thread.java:722) Caused by: com.mysql. ...
随机推荐
- Oracle dblink详解
database link概述 database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序.在任何分布式环境里,databas ...
- (copy)赋值构造函数的4种调用时机or方法
第一种调用方法: demo #include <iostream> using namespace std; class Text { public: Text() // 无参数构造函数 ...
- 02网格布局Gridlayout
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8& ...
- Git Bash+EGit在项目中配合使用最常用方法总结(根据场景使用)
最近在项目中使用Git进行代码管理,之前一直用SVN进行管理,现在谈一谈Git在项目中如何与EGit插件配合使用,高效同步开发. 使用过SVN一段时间的人,初识Git一定感觉很别扭,发现会遇到各种各样 ...
- Rational Rose正逆向工程(类图转Java代码,Java代码转类图)
一,正向工程 1.设置默认语言为Java,Tools->Options->Notation->default:选择Java. 2.设置环境变量Class ...
- Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系
在学习java,根据视频做实例的过程中,对equals和hashcode两个方法理解稍微深刻一点,主要是它们两个很容易混淆,容易出错,自己又通过网上的资料学习,和大家分享 equals()方法 equ ...
- TCP/IP入门(1) --链路层
/** 本博客由汗青ZJF整理并发布, 转载请注明出处: http://blog.csdn.net/zjf280441589/article/category/1854365 */ TCP/IP体系结 ...
- Java:函数
import java.util.Scanner; public class HelloWorld { public static void main(String[] args){ Scanner ...
- java实现:将一个数逆序输出
前面我们用C语言实现过这个程序,其实java也一样的,很多步骤跟C差不多,但是有些接口和特性可能不同: import java.util.Scanner;//要使用scanner这个类,就需要导入一个 ...
- 2015年CSDN博客排名第一名,何方神圣?
2015年CSDN博客排名第一名,何方神圣? 一.引子: 话说博主phphot,雄霸天下好多年. 俱往矣, 落花流水春去也. 斗转星移,江山易主. 详细可以参见下文: CSDN博客排名第一名,何许人也 ...