什么是JTA -
2009-07-25 18:31:06| 分类: 技术文章|举报|字号 订阅
什么是JTA?
Java Transaction
API(Java事务API) (JTA)Java Transaction API(Application Programming
Interface)
什么是JTA Transaction?它有怎样的特点呢?JTA Transaction是指由J2EE
Transaction
manager去管理的事务。其最大的特点是调用UserTransaction接口的begin,commit和rollback方法来完成事务范围的界定,事务的提交和回滚。JTA
Transaction可以实现同一事务对应不同的数据库,但是它仍然无法实现事务的嵌套。
分布式事务的规范由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][*]实体企业
Bean Entity1 在应用程序服务器 AppServer1 中部署。[*]实体企业 Bean Entity2 在应用程序服务器 AppServer1
中部署。[*]会话企业 Bean Session1 在应用程序服务器 AppServer1 中部署。[/list]如果 Session1 对同一事务内的
Entity1 和 Entity2 调用了方法而这两个企业 Bean 正在使用不同的物理数据库连接,则必须对 Entity1 和 Entity2
使用的数据源启用 JTA。当从相同的数据源对象获取那些连接时,这也是成立的。这需要具有 JTA 能力的驱动程序以提交事务。
当事务涉及到多个进程时,JTA
也是必需的。例如,一个事务可能会涉及在多个应用程序服务器中部署的企业 Bean。
[list=1][*]实体企业 Bean Entity1
在应用程序服务器 AppServer1 中部署。[*]实体企业 Bean Entity2 在应用程序服务器 AppServer2 中部署。[*]会话企业
Bean Session1 在应用程序服务器 AppServer1 中部署。[/list]如果 Session1 对同一事务(此事务构成一个分布式事务)内的
Entity1 和 Entity2 调用了方法,则必须对 Entity1 和 Entity2 使用的数据源启用 JTA。
性能实现JTA 启用的连接与非
JTA 启用的连接执行情况不同。基于此原因,如果您的应用程序不需要 JTA,则最好使用非 JTA 启用的驱动程序。
其它信息有关
WebSphere Application Server 如何支持 JTA 的信息,参见
[url=http://publib.boulder.ibm.com/was400/40/AE/simpchinese/docs/dattrnpr.html][color=#0000ff]WebSphere
Application Server 和 DB2 UDB iSeries 版的事务处理[/color][/url]及其子主题。
有关 JTA
规范的更多信息,参见下列站点:[url=http://java.sun.com/products/jta/][color=#0000ff]http://java.sun.com/products/jta/[/color][/url]
[url=http://java.sun.com/products/jta/][img=18,15]http://publib.boulder.ibm.com/was400/40/AE/simpchinese/docs/www.gif[/img][/url]
JNDI(Java
Naming and Directory
Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。
JNDI可访问的现有的目录及服务有:
DNS、XNam
、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、
CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML
v1&v2、NIS。
JNDI优点:
包含了大量的命名和目录服务,使用通用接口来访问不同种类的服务;
可以同时连接到多个命名或目录服务上;
建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必指导对象或资源的物理ID。
JNDI程序包:
javax.naming:命名操作;
javax.naming.directory:目录操作;
javax.naming.event:在命名目录服务器中请求事件通知;
javax.naming.ldap:提供LDAP支持;
javax.naming.spi:允许动态插入不同实现。
利用JNDI的命名与服务功能来满足企业级APIs对命名与服务的访问,诸如EJBs、JMS、JDBC
2.0以及IIOP上的RMI通过JNDI来使用CORBA的命名服务。
JNDI与JDBC:
JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个纪录,同时返回数据库连接建立所必须的信息。
代码示例:
try{
Context
cntxt = new InitialContext();
DataSource ds = (DataSource)
cntxt.lookup("jdbc/dpt");
}
catch(NamingException
ne){
...
}
JNDI与JMS:
消息通信是软件组件或应用程序用来通信的一种方法。JMS就是一种允许应用程序创建、发送、接收、和读取消息的JAVA技术。
代码示例:
try{
Properties
env = new Properties();
InitialContext inictxt = new
InitialContext(env);
TopicConnectionFactory connFactory =
(TopicConnectionFactory)
inictxt.lookup("TTopicConnectionFactory");
...
}
catch(NamingException
ne){
...
}
访问特定目录:举个例子,人是个对象,他有好几个属性,诸如这个人的姓名、电话号码、电子邮件地址、邮政编码等属性。通过getAttributes()方法
Attribute
attr =
directory.getAttributes(personName).get("email");
String email =
(String)attr.get();
通过使用JNDI让客户使用对象的名称或属性来查找对象:
foxes =
directory.search("o=Wiz,c=US", "sn=Fox",
controls);
通过使用JNDI来查找诸如打印机、数据库这样的对象,查找打印机的例子:
Printer printer =
(Printer)namespace.lookup(printerName);
printer.print(document);
浏览命名空间:
NamingEnumeration
list = namespace.list("o=Widget, c=US");
while (list.hasMore())
{
NameClassPair entry =
(NameClassPair)list.next();
display(entry.getName(),
entry.getClassName());
}
参考资料:
http://java.sun.com/products/jndi/examples.html
http://java.sun.com/products/jndi/serviceproviders.html