[原创]对于JNDI和JTA的学习
一、JNDI
1.基本概念
JNDI(The Naming and Directory Interface,Java命名和目录接口)是一组Java应用中访问命名和目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。
Naming Service命名服务,本质上是一种注册和定位服务,即将名字和一个对象相关联,通过名字可以方便地找到对应的对象。例如:文件系统就包含了一个命名服务,你可以通过文件名找到对应的文件对象。
Directory Service目录服务,是命名服务的扩展和提高,提供了对命名信息的管理和操作,即对属性的查询、增加、修改、删除操作。
目录服务器,是提供命名和目录服务的系统,实际上是一种特殊的数据库,其结构为树状目录,特别适合查询多但更新少的应用。常见的目录服务器:LDAP,DNS等。
Directory目录,目录是目录服务器的主体,通过属性来保存命名信息。
Context上下文,目录中的每个节点可以被认为是一个上下文,目录服务允许我们读取和修改上下文相关的属性,并且可以用这些属性作为过滤器来搜索一个上下文。
Service Provider服务提供者,每一个目录服务器都要求有一个服务提供者,以把JNDI映射到该目录服务所支持的特定 操作。
2.JNDI架构
JNDI架构提供了一组标准的独立于命名系统的API,这些API构建在与命名系统有关的驱动之上。这一层有助于将应用与实际数据源分离,���此不管应用访问的是LDAP、RMI、DNS、还是其他的目录服务。换句话说,JNDI独立于目录服务的具体实现,只要你有目录的服务提供接口(或驱动),你就可以使用目录。
JNDI制定了一组公开的API和一组SPI,API是面向应用程序开发者的,SPI是面向目录服务器生产厂商。
3.JNDI API
JNDI API 由5个包组成:javax.naming 提供了访问命名服务的类和接口,其中最重要的是Context和InitalContext接口,它们是命名服务器的入口。
Javax.naming.directory:对命名包的扩充,提供了访问目录服务的类和接口。例如,它为属性增加了新的类,提供了表示目录上下文的DirContext接口,定义了检查和更新目录对象的属性的方法。
Javax.naming.event:提供了对访问命名和目录服务时的时间通知的支持。例如,定义了NamingEvent类,这个类用来表示命名/目录服务产生的事件,定义了侦听NamingEvents的NamingListener接口。
Javax.naming.ldap:这个包提供了对LDAP 版本3扩充的操作和控制的支持,通用包javax.naming.directory没有包含这些操作和控制。
Javax.naming.spi:这个包提供了一个方法,通过javax.naming和有关包动态增加对访问命名和目录服务的支持。这个包是为有兴趣创建服务提供者的开发者提供的。
二、JTA
JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。Java事务API(JTA;Java Transaction API)和它的同胞Java事务服务(JTS;Java Transaction Service),为J2EE平台提供了分布式事务服务��一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。一个资源管理器(resource manager)是任意类型的持久化数据存储。事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。下车站显示了事务管理器和资源管理的间的关系。
常用的DAO模式事务界定方式除了JTA事务,还有JDBC事务。
JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。
在jdbc中,事务操作缺省是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作,操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回滚。
在jdbc中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交,倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常;此时就可以在异常捕获时调用rollback()进行回滚。这样做可以保持多次更新操作后,相关数据的一致性。
JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中:JDBC连接,JDO PersistenceManager 对象,JMS 队列,JMS 主题,企业JavaBeans(EJB),一个用J2EE Connector Architecture 规范编译的资源分配器。
一般情况下,J2EE应用服务器是支持JDBC事务、JTA事务、容器管理事务三种事务的。