JNDI,JTA和JMS简介

什么是JNDI

原理:在DataSource中事先建立多个数据库连接,保存在数据库连接池中。当程序访问数据库时,只用从连接池中取空闲状态的数据库连接即可,访问结束,销毁资源,数据库连接重新回到连接池,这与每次去直接访问数据库相比,会节省大量时间和资源。

JNDI( Java Naming and DirectoryInterface ),是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 表示认证方式,一般为Container

type 表示数据源床型,使用标准的javax.sql.DataSource

maxActive 表示连接池当中最大的数据库连接

maxIdle 表示最大的空闲连接数

maxWait 当池的数据库连接已经被占用的时候,最大等待时间

logAbandoned 表示被丢弃的数据库连接是否做记录,以便跟踪

username 表示数据库用户名

password 表示数据库用户的密码

driverClassName 表示JDBC DRIVER

url 表示数据库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 是环境命名上下文(environmentnaming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。ENC是一个引用,引用是用于定位企业应用程序的外部资源的逻辑名。引用是在应用程序部署描述符文件中定义的。在部署时,引用被绑定到目标可操作环境中资源的物理位置(JNDI名)。使用ENC是把对其它资源的JNDI查找的硬编码解脱出来,通过配置这个引用可以在不修改代码的情况下,将引用指向不同的EJB(JNDI)。

什么是JTA

Java Transaction API(Java事务API)(JTA)Java Transaction API(Application Programming Interface)

什么是JTA Transaction?它有怎样的特点呢?JTA Transaction是指由J2EE Transaction manager去管理的事务。其最大的特点是调用UserTransaction接口的begin,commit和rollback方法来完成事务范围的 界定,事务的提交和回滚。JTATransaction可以实现同一事务对应不同的数据库,但是它仍然无法实现事务的嵌套。

分布式事务的规范由OMG的OTS所描述。

JTA是只是一组java接口用于描述,J2ee框架中事务管理器与应用程序,资源管理器,以及应用服务器之间的事务通讯。

它主要包括高层接口即面向应用程序的接口;XAResource接口即面向资源的接口;以及事务管理器的接口。值得注意的是JTA只提供了接口,没有具体的实现。

JTS是服务OTS的JTA的实现。简单的说JTS实现了JTA接口,并且符合OTS的规范。

资源管理器只要其提供给事务管理器的接口符合XA接口规范,就可以被事务管理器处理。 所以,JTA可以处理任何提供符合XA接口的资源。包括:数据库,JMS,商业对象等等

“Java 事务 API”(JTA)启用两阶段提交功能。当配置WebSphere Application Server 以访问数据库时,可选择具有 JTA 能力的驱动程序。如果需要两阶段提交功能,则必须使用启用 JTA 的驱动程序。

只要您在事务中调用了多个数据库连接,就需要 JTA。只要您在事务中调用了多个数据库服务器,就需要两阶段提交。这些连接可以是相同的物理数据库服务器或多个数据库服务器。例如:

[list=1][*]实体企业 BeanEntity1 在应用程序服务器 AppServer1 中部署。[*]实体企业 Bean Entity2 在应用程序服务器AppServer1 中部署。[*]会话企业 Bean Session1 在应用程序服务器 AppServer1 中部署。[/list]如果Session1 对同一事务内的 Entity1 和 Entity2 调用了方法而这两个企业 Bean 正在使用不同的物理数据库连接,则必须对 Entity1 和 Entity2 使用的数据源启用 JTA。当从相同的数据源对象获取那些连接时,这也是成立的。这需要具有 JTA 能力的驱动程序以提交事务。
当事务涉及到多个进程时,JTA 也是必需的。例如,一个事务可能会涉及在多个应用程序服务器中部署的企业 Bean。
[list=1][*]实体企业 BeanEntity1 在应用程序服务器 AppServer1 中部署。[*]实体企业 Bean Entity2 在应用程序服务器AppServer2 中部署。[*]会话企业 Bean Session1 在应用程序服务器 AppServer1 中部署。[/list]如果Session1 对同一事务(此事务构成一个分布式事务)内的 Entity1 和 Entity2 调用了方法,则必须对 Entity1 和 Entity2 使用的数据源启用 JTA。
性能实现JTA 启用的连接与非 JTA 启用的连接执行情况不同。基于此原因,如果您的应用程序不需要 JTA,则最好使用非 JTA 启用的驱动程序。

其它信息有关 WebSphere Application Server 如何支持 JTA 的信息,参见 WebSphere Application Server 和 DB2UDB iSeries 版的事务处理及其子主题。

什么是JMS

jms即Java消息服务(JavaMessage Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。jms同时也可以指Journal of Marketing Science,《营销科学学报》的简称。此外,佳木斯的拼音缩写也是jms。

传递方式

JMS有两种传递消息的方式。标记为NON_PERSISTENT的消息最多投递一次,而标记为PERSISTENT的消息将使用暂存后再转送的机理投递。如果一个JMS服务离线,那么持久性消息不会丢失但是得等到这个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使使用非持久性消息可能降低内务和需要的存储器,并且这种传递方式只有当你不需要接收所有的消息时才使用。

虽然JMS规范并不需要JMS供应商实现消息的优先级路线,但是它需要递送加快的消息优先于普通级别的消息。JMS定义了从0到9的优先级路线级别,0是最低的优先级而9则是最高的。更特殊的是0到4是正常优先级的变化幅度,而5到9是加快的优先级的变化幅度。举例来说: topicPublisher.publish (message, DeliveryMode.PERSISTENT, 8, 10000); //Pub-Sub 或 queueSender.send(message,DeliveryMode.PERSISTENT, 8, 10000);//P2P  这个代码片断,有两种消息模型,映射递送方式是持久的,优先级为加快型,生存周期是10000 (以毫秒度量)。如果生存周期设置为零,这则消息将永远不会过期。当消息需要时间限制否则将使其无效时,设置生存周期是有用的。

总结

本文关于JNDI,JTA和JMS简介就到这里,希望对大家有所帮助。

(0)

相关推荐

  • Spring-boot JMS 发送消息慢的解决方法

    Spring-boot JMS 发送消息慢的问题解决 1.在<ActiveMQ 基于zookeeper的主从(levelDB Master/Slave)搭建以及Spring-boot下使用>中,采用以下代码进行JMS消息发送: @Service public class Producer { @Autowired private JmsMessagingTemplate jmsTemplate; public void sendMessage(Destination destination,

  • 用jmSlip编写移动端顶部日历选择控件

    本文为大家分享了jmSlip移动端日历选择组件,可滚动选日期,并限制哪些日期可选和不可选. 主要用来根据后台返回生成一个日期选择器. 具体实现可关注jmslip: https://github.com/jiamao/jmSlip 示例:http://slip.jm47.com/demo/calendar/index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <

  • Java中JDBC事务与JTA分布式事务总结与区别

    Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务.常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现.所以本文暂不讨论容器事务.本文主要介绍J2EE开发中两个比较基本的事务:JDBC事务和JTA事务. JDBC事务 JDBC的一切行为包括事务是基于一个Connection的,在JDBC中是通过Connection对象进行事务管理.在JDBC中,

  • JMS 之 Active MQ 的消息传输(详解)

    本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与ActiveMQ交互,实际上都是与ActiveMQ中的Broker交互,Broker配置在${MQ_HOME}\conf\activemq.xml. 二.连接器(Connectors)(一).传输连接器 (transportConnectors) transportConnectors 连接器:就是建立brok

  • java Swing实现选项卡功能(JTabbedPane)实例代码

     Swing实现选项卡功能(JTabbedPane) 先创建JTabbedPane对象,构造函数可使用JTabbedPane(int tabPlacement).tabPlacement是JTabbedPane从接口 javax.swing.SwingConstants 继承的字段.可以是BUTTOM,TOP等.如下代码所示: JFrame jframe = new JFrame("TEST"); <a href="http://lib.csdn.net/base/do

  • JNDI,JTA和JMS简介

    什么是JNDI 原理:在DataSource中事先建立多个数据库连接,保存在数据库连接池中.当程序访问数据库时,只用从连接池中取空闲状态的数据库连接即可,访问结束,销毁资源,数据库连接重新回到连接池,这与每次去直接访问数据库相比,会节省大量时间和资源. JNDI( Java Naming and DirectoryInterface ),是Java平台的一个标准扩展,提供了一组接口.类和关于命名空间的概念.如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个 A

  • JMS简介与ActiveMQ实战代码分享

    一.异步通信 之前接触到的RMI,Hessian等技术都是同步通信机制.当客户端调用远程方法时,客户端必须等到远程方法完成后,才能继续执行.这段时间客户端一直会被阻塞(这样造成的用户体验很不好). (同步通信) 同步通信有并不是程序之间交互的唯一方式,异步通信机制中,客户端不需要等待服务处理消息,可以继续执行,并且最终能够收到并处理消息. (异步通信) 异步通信的优势 无需等待.客户端只需要将消息发送给消息代理,不需要等待就可以继续执行别的任务,且确信消息会被投递给相应的目的地. 面向消息和解耦

  • 一名Java高级工程师需要学什么?

    从两方面讨论一名java高级工程师需要学些什么,具备什么能力,感兴趣的小伙伴们可以参考一下 宏观上: 1.技术广度方面 至少要精通多门开源技术吧,研究过struts\spring等的源码. 2.项目经验方面 从头到尾跟过几个大项目,头是指需求阶段,包括需求调研. 尾是指上线交付之后,包括维护阶段. 3.架构经验方面 有过分布式系统的架构和开发经验.对于跨系统的结构优化,数据存储的性能指标等有丰富经验.什么缓存啊.数据库的垂直切分什么的,业务的抽象和水平拆分啊,这些应该都轻车熟路吧. 4.行业领域

  • JNDI简介_动力节点Java学院整理

    一.JNDI是什么? JNDI--Java 命名和目录接口(Java Naming and Directory Interface),是一组在Java应用中访问命名和目录服务的API. 二.JNDI好处 解耦:通过注册.查找JNDI服务,可以直接使用服务,而无需关心服务提供者,这样程序不至于与访问的资源耦合! JNDI优点  包含了大量的命名和目录服务,使用通用接口来访问不同种类的服务: 可以同时连接到多个命名或目录服务上: 建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必知道对象

  • Weblogic上配置Hibernate为JNDI

    一.首先需要把Hibernate 用到的jar包和配置文件都放到Weblogic能够搜索到的CLASSPATH路径上.单单这一步就有很多人很迷茫,其实去仔细看看Weblogic的启动脚本文件startWeblogic.cmd和startWLS.cmd,我想大部分人都知道该怎么配置了. 我机器上的有个Hibernate的项目,在D: estoracle目录下,该目录下的结构是: D: estoraclelib 放置hibernate的所有jar包 D: estoraclesrc 放置源代码 D:

  • JavaEE简介_动力节点Java学院整理

    在我们深入J2EE之前,先看一下综述: 多层式应用(Multitier Application)--多层式应用(或者多层式架构)分成多个逻辑部分,大多在多层服务器上实现.例如,三层应用模型:用户和浏览器,应用服务器,数据库服务器.其中应用服务器和数据库服务器就是分别在不同的服务器上来处理应用的请求. 多层式服务(Multitier Service)--以三层架构模型的服务为例,应用服务器响应用户的请求.数据库服务器响应应用服务器的查询求情. Java Bean--由一些包含私有属性的Java类组

  • Spring Boot 简介(入门篇)

    1.什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置, 从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 2.SpringBoot特性 1).创建独立的Spring项目 2).内置Tomcat和Jetty容器 3).提供一个sta

  • 全面解析JTA 深度历险

    什么是事务处理 事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity ).一致性 ( Consistency ).隔离性 ( Isolation ) 和持久性 ( Durabilily ).关于事务最经典的示例莫过于信用卡转账:将用户 A 账户中的 500 元人民币转移到用户 B 的账户中,其操作流程如下 : 1. 将 A 账户中的金额减少 500 2. 将 B 账户中的金额增加 500 这两个操作必须保正 ACID 的事务属性:即要么全部成功,要么全部失败:假

  • Java中的命名与目录接口JNDI基本操作方法概览

    对jndi总体的理解: jndi(java naming and directory Interface)它提供了一套使用命名和目录服务的接口.用户可以通过它来使用命名和目录服务.就像jdbc一样.jndi包括命名服务和目录服务两部分,其中目录服务包含目录对象directory object,它包含若干属性对象.提供了对属性的很多操作. 命名和目录服务: 命名和目录服务我们一直在使用,如操作系统的文件系统,它给我们提供对文件的操作,查询,添加删除等功能.DNS服务将url同ip地址绑定在了一起.

随机推荐