JNDI全面总结

JNDI全面总结原理:         在DataSource中事先建立多个数据库连接,保存在数据库连接池中。当程序访问数据库时,只用从连接池中取空闲状态的数据库连接即可,访问结束,销毁资源,数据库连接重新回到连接池,这与每次去直接访问数据库相比,会节省大量时间和资源。         JNDI( Java Naming and Directory Interface ),是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个 API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括 LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。可以把它理解为一种将对象和名字捆绑的技术,对象工厂负责生产出对象,这些对象都和唯一的名字绑在一起,外部资源可以通过名字获得某对象的引用。          在javax.naming的包包中提供Context接口,提供了两个很好用的方法:<1> void bind( String name , Object object )        将名称绑定到对象。所有中间上下文和目标上下文(由该名称最终原子组件以外的其他所有组件指定)都必须已经存在。<2>Object lookup( String name )       检索指定的对象。如果 name为空,则返回此上下文的一个新实例(该实例表示与此上下文相同的命名上下文,但其环境可以独立地进行修改,而且可以并发访问)。运行机制:1、 首先程序代码获取初始化的 JNDI 环境并且调用 Context.lookup() 方法从 JNDI 服务提供者那里获一个 DataSource 对象2、 中间层 JNDI 服务提供者返回一个 DataSource 对象给当前的 Java 应用程序这个 DataSource 对象代表了中间层服务上现存的缓冲数据源 3、 应用程序调用 DataSource 对象的 getConnection() 方法4、 当 DataSource 对象的 getConnection() 方法被调用时,中间层服务器将查询数据库 连接缓冲池中有没有 PooledConnection 接口的实例对象。这个 PooledConnection 对象将被用于与数据库建立物理上的数据库连接5、 如果在缓冲池中命中了一个 PooledCoonection 对象那么连接缓冲池将简单地更 新内部的缓冲连接队列并将该 PooledConnection 对象返回。如果在缓冲池内没 有找到现成的 PooledConnection 对象,那么 ConnectionPoolDataSource 接口将会被 用来产生一个新的 PooledConnection 对象并将它返回以便应用程序使用6。 中间层服务器调用 PooledConnection 对象的 getConnection() 方法以便返还一个 java.sql.Connection 对象给当前的 Java 应用程序7、 当中间层服务器调用 PooledConnection 对象的 getConnection() 方法时, JDBC 数据 库驱动程序将会创建一个 Connection 对象并且把它返回中间层服务器8、 中间层服务器将 Connection 对象返回给应用程序 Java 应用程序,可以认为这个 Connection 对象是一个普通的 JDBC Connection 对象使用它可以和数据库建立。事 实上的连接与数据库引擎产生交互操作 。9、 当应用程序不需要使用 Connection 对象时,可以调用 Connection 接口的 close() 方 法。请注意这种情况下 close() 方法并没有关闭事实上的数据库连接,仅仅是释 放了被应用程序占用的数据库连接,并将它还给数据库连接缓冲池,数据库连接 缓冲池会自动将这个数据库连接交给请求队列中下一个的应用程序使用。现在,数据库的连接没有用到连接池几乎很少很少,每个项目组都可能有自己的数据库连接池组件,各容器提供商也提供了各自的数据库连接池,下面介绍一下tomcat的数据库连接管理。tomcat6 数据源配置(server.xml方式和context.xml方式)在server.xml下配置你必需重启服务器才能生效,而context.xml配置保存后tomcat会自动加载无需重启在JNDI配配置数据源中需注意:项目下需要引入数据库驱动包,并且TOMCAT下也需要引入,不然会报错的1.context.xml方式Tomcat-6.0.26\conf\context.xml文件当添加以下的配置信息:<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"               maxActive="100" maxIdle="30" maxWait="60" wait_timeout="18800" timeBetweenEvictionRunsMillis="300000" minEvictableIdleTimeMillis="600000"               username="root" password="jdzxdb" driverClassName="com.mysql.jdbc.Driver"               url="jdbc:mysql://localhost:3306/sxtele?comautoReconnect=true&failOverReadOnly=false"  removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"/><Resource name="jdbc/db2" auth="Container" type="javax.sql.DataSource"               maxActive="100" maxIdle="30" maxWait="60" wait_timeout="18800" timeBetweenEvictionRunsMillis="300000" minEvictableIdleTimeMillis="600000"               username="lcgluser" password="lcgluser" driverClassName="com.ibm.db2.jcc.DB2Driver"               url="jdbc:db2://133.64.46.65:50000/STEDWDB"  removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"/> 其中:name 表示指定的jndi名称auth 表示认证方式,一般为Containertype 表示数据源床型,使用标准的javax.sql.DataSourcemaxActive 表示连接池当中最大的数据库连接maxIdle 表示最大的空闲连接数maxWait 当池的数据库连接已经被占用的时候,最大等待时间logAbandoned 表示被丢弃的数据库连接是否做记录,以便跟踪username 表示数据库用户名password 表示数据库用户的密码driverClassName 表示JDBC DRIVERurl 表示数据库URL地址

注意,这里你配置的name值要和程序中使用的是一样的,比如按照这个例子,程序就应该是这样的Java代码String gENV = "java:comp/env/";  Context ctx = new InitialContext();          DataSource ds = (DataSource)ctx .lookup(gENV+"jdbc/mysql");        Connection conn = ds.getConnection(); String gENV = "java:comp/env/";Context ctx = new InitialContext();      DataSource ds = (DataSource)ctx.lookup(gENV+"jdbc/db2");      Connection conn = ds.getConnection();

关于获取数据源的语法,大体有(javax.sql.DataSource) ctx.lookup ("java:comp/env/XXX")和(javax.sql.DataSource) ctx.lookup("XXX")两种写法,好多人以为这两种写法是相同的,以为都是通过JNDI来获取数据源。其实java:comp/env和 JNDI是不同的,java:comp/env 是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。ENC是一个引用,引用是用于定位企业应用程序的外部资源的逻辑名。引用是在应用程序部署描述符文件中定义的。在部署时,引用被绑定到目标可操作环境中资源的物理位置(JNDI名)。使用ENC是把对其它资源的JNDI查找的硬编码解脱出来,通过配置这个引用可以在不修改代码的情况下,将引用指向不同的EJB(JNDI)。 在J2EE中的引用常用的有:
时间: 2024-10-08 13:46:27

JNDI全面总结的相关文章

JNDI在Tomcat中的配置

使用JNDI获取连接对象 java:comp/env/jdbc/news 这段为固定写法java:comp/env/ 在Tomcat中的配置 配置在:context.xml文件内 F:\apache-tomcat-7.0.68-windows-x64\apache-tomcat-7.0.68\conf\context.xml ---------mySQL<Resource name="jdbc/news"auth="Container" type="

JNDI

JNDI基础 一 简介 1.JNDI:Java Naming and Directory Interface,即Java命名和目录接口.JNDI包含了一些标准API接口,Java程序可以通过这些接口来访问命名目录服务.JNDI不依赖于任何独立的命名目录服务器,不管采用哪种命名目录服务器,应用程序都可以通过统一的JNDI接口来调用.要使用JNDI,必须要安装jdk 1.3以上版本. 2.命名服务:就是将名字和计算机系统内的一个对象建立关联,从而允许应用程序通过该名字访问该对象.简而言之,命名服务就

理解JNDI中 java:comp/env/jdbc/datasource 与 jdbc/datasource 的不同之处(转)

在描述JNDI,例如获得数据源时,JNDI地址有两种写法,例如同是  jdbc/testDS 数据源: A:java:comp/env/jdbc/testDS B:jdbc/testDS   这两种写法,配置的方式也不尽相同,第一种方法应该算是一种利于程序移植或迁移的方法,它的实现与“映射”的概念相同,而B方法,则是一个硬引用. java:comp/env 是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来J

JPA, JNDI, OSGi

JPA Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. JNDI Java Naming and Directory Interface,Java命名和目录接口,是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务

JNDI深入浅出

1.什么是JNDI JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用名称访问对象.目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性. 命名或目录服务使你可以集中存储共有信息,这一点在网络应用中是重要的,因为这使得这样的应用更协调.更容易管理.例如,可以将打印机设置存储在目录服务中,以便被与打印机有关的应用使用. 命名服务中的

Springmvc +JNDI 在Tomcat下 配置数据源(转)

一.             简介 jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用名称访问对象.目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性. 二.             tomcat配置jndi有三种方式. 第一种:单个应用独享数据源 在Tomcat的server.xml找到工程的Context节点,添加一个私有数据源 <

tomcat配置JNDI获取数据源

各个web工程可以通过工程内的xml文件配置访问数据库的数据源,这样的配置是各个工程私有的.基于JNDI为tomcat配置数据源,则可以做成全局的,各工程只需要通过便签引用数据源即可. 1.需要将数据库的连接驱动mysql-connector-java-5.1.21.jar及数据库连接池的jar包druid-0.2.9.jar放到Tomcat 6.0\lib下. 2.修改tomcat的配置文件,基于JNDI配置数据源,Tomcat 6.0\conf\context.xml改成如下即可,原文件中多

JNDI 使用

J2EE技术规范(一)--JNDI 分类: java 基础2012-12-02 20:05 1539人阅读 评论(14) 收藏 举报 学习Java,我们首先要掌握的就是十三种技术规范,我们接下来就一步一步的来学习.今天主要是讲讲JNDI. 一.理解JNDI的用途: JNDI是用于访问不同的命名和目录服务的统一API接口. 二.那何时使用JNDI呢: (1)JNDI是一种查找服务,用于查找: Web应用环境变量 EJBs和它们的环境变量 通过DataSources的数据库连接池 JMS目标和连接工

Hibernate 异常 : Error parsing JNDI name [xxx]

初学 Hibernate ,用官方给的日志模板配置好了日志,跑起小例子, 控制台中的日志里写了一些异常: 21:16:36,036 DEBUG EntityLoader:146 -  Static select for entity cn.sjll.hibernate435.model.UserModel  [OPTIMISTIC_FORCE_INCREMENT]: select usermodel0_.ID as ID1_0_0_,  usermodel0_.NAME as NAME2_0_0

JNDI数据源的使用

有时候我们数据库的连接会使用jndi的方式 try { InitialContext ic = new InitialContext(); dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/murach"); } catch(Exception e) { e.printStackTrace(); } 各种不同的J2EE容器,都用不同的配置方式. tomcat可以配置全局JNDI和私有JNDI(注意这里说的Tomcat6):