`
javasogo
  • 浏览: 1821376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

TopLink源代码分析 JTA的部分技术实现细节

阅读更多

TopLink源代码分析 JTA的部分技术实现细节

[什么是JTA]

JavaAPIJTAJava Transaction API)和它的同胞Java(JTSJava TransactionService)J2EE平台提供了分布式事。一个分布式事distributedtransaction)包括一个事管理器(transaction manager)和一个或多个源管理器(resource manager)。一个源管理器(resource manager)是任意型的持久化数据存管理器(transaction manager)承担着所有事参与元者的相互通任。下图显示了事管理器和源管理的系。

  JTAJDBC大。一个JTA可以有多个参与者,而一个JDBC务则被限定在一个一的数据库连接。下列任一个Java平台的件都可以参与到一个JTA中:

  .JDBC

  .JDO PersistenceManager

  .JMS

  .JMS

  .JavaBeansEJB

  .一个用J2EE Connector Architecture 编译源分配器。

简单的说,JTA实现了在分布式系统中对单一事务的提交和管理。

[源代码分析]

第一步:当连接数据库的时候,前期的准备函数,这里面都发生了什么?

/**

* INTERNAL:

* This method includes all of the code that is issued before the datasource

* is connected to.

*/

protected void preConnectDatasource(){

//Bug#3440544 Check if logged in already to stop the attempt to login more than once

if (isLoggedIn) {

throw ValidationException.alreadyLoggedIn(this.getName());

}

this.platform = null;

if (isInProfile()) {

getProfiler().initialize();

}

updateProfile(SessionProfiler.LoginTime, new Date(System.currentTimeMillis()));

// Login and initialize

getEventManager().preLogin(this);

//setup the external transaction controller

getServerPlatform().initializeExternalTransactionController();

log(SessionLog.INFO, null, "topLink_version", DatasourceLogin.getVersion());

if (getServerPlatform().getServerNameAndVersion() != null) {

log(SessionLog.FINE, null, "application_server_name_and_version", getServerPlatform().getServerNameAndVersion());

}

}

第二步:上面的程序中,有这样一行代码

//setup the external transaction controller getServerPlatform().initializeExternalTransactionController();

它是干什么的呢???

public void initializeExternalTransactionController() {

this.ensureNotLoggedIn();

//BUG 3975114: Even if JTA is disabled, override if we're in CMP

//JTA must never be disable during CMP (WLS/Oc4j)

if (!isJTAEnabled() && !isCMP()) {

return;

}

//BUG 3975114: display a warning if JTA is disabled and we're in CMP

if (!isJTAEnabled() && isCMP()) {

AbstractSessionLog.getLog().warning("jta_cannot_be_disabled_in_cmp");

}

//check if the transaction controller class is overridden by a preLogin or equivalent,

//or if the transaction controller was already defined, in which case they should have written

//a subclass. Show a warning

try {

if (getDatabaseSession().getExternalTransactionController() != null) {

this.externalTransactionControllerNotNullWarning();

return;

}

ExternalTransactionController controller = null;

if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){

try {

controller = (ExternalTransactionController)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(this.getExternalTransactionControllerClass()));

} catch (PrivilegedActionException exception) {

Exception throwableException = exception.getException();

if (throwableException instanceof InstantiationException) {

throw ValidationException.cannotCreateExternalTransactionController(getExternalTransactionControllerClass().getName());

} else {

throw ValidationException.cannotCreateExternalTransactionController(getExternalTransactionControllerClass().getName());

}

}

} else {

controller = (ExternalTransactionController)PrivilegedAccessHelper.newInstanceFromClass(this.getExternalTransactionControllerClass());

}

getDatabaseSession().setExternalTransactionController(controller);

} catch (InstantiationException instantiationException) {

throw ValidationException.cannotCreateExternalTransactionController(getExternalTransactionControllerClass().getName());

} catch (IllegalAccessException illegalAccessException) {

throw ValidationException.cannotCreateExternalTransactionController(getExternalTransactionControllerClass().getName());

}

}

乖乖~~~~~这么长的函数,鬼知道它做的是什么。。。。

不过,貌似它里面有这样一行话。

getDatabaseSession().setExternalTransactionController(controller);

乖乖~~~~原来是用来启动JTA事务管理控制器的。。。快点去看看它干了什么。。

第三步:啊哈,奥秘在这里

public class SunAS9TransactionController extends JTATransactionController {

// Use "java:appserver/TransactionManager" instead of java:pm/TransactionManager

// as the former one is available in ACC as well as server.

// See com.sun.enterprise.naming.java.javaURLContext in GlassFish appserv-core

public static final String JNDI_TRANSACTION_MANAGER_NAME = "java:appserver/TransactionManager";

public SunAS9TransactionController() {

super();

}

/**

* INTERNAL:

* Obtain and return the JTA TransactionManager on this platform

*/

protected TransactionManager acquireTransactionManager() throws Exception {

return (TransactionManager)jndiLookup(JNDI_TRANSACTION_MANAGER_NAME);

}

}

同志们看见了吗~~~~

public static final String JNDI_TRANSACTION_MANAGER_NAME = "java:appserver/TransactionManager";

搞了半天,原来它用JMX启动了一个交易服务来管理JTA~~~

???什么是<span styl

分享到:
评论

相关推荐

    TopLink 教程

    TopLink也实现了Java Persistence API(JPA),这是Java EE平台的一部分,提供了一套标准的ORM规范。通过JPA,TopLink可以与其他遵循JPA的应用程序组件无缝集成,例如EJB和Spring框架。 6. **动态模型** TopLink...

    ibatis文档

    iBATIS 提供了多种数据访问实现,包括 JDBC、Hibernate、Toplink、JTASQLMap 等,为开发者提供了灵活的选择。 #### 二、iBATIS DAO 实现与设计 ##### 2.1 DAO 设计模式 DAO (Data Access Object) 是一种常用的...

    java EE 5完全学习手册课件

    2. JSP(JavaServer Pages):JSP是一种动态网页技术,允许开发者在HTML代码中嵌入Java代码,以实现视图层的动态渲染。 3. EJB(Enterprise JavaBeans):EJB是Java EE中的业务逻辑组件,用于构建可复用、可部署的...

    成为Java高手的25个学习目标.doc

    15. **J2EE技术**:掌握JNDI(Java命名和目录接口)、JMS(Java消息服务)、JTA/JTS(Java事务API/Java事务服务)、JMX(Java管理扩展)和JavaMail等技术。 通过逐步学习和实践这些目标,你可以逐步提升自己的Java...

    常用jar包说明

    - **c3p0.jar**:C3P0是一个开放源代码的JDBC连接池,被许多框架如Hibernate用作数据源管理,优化数据库连接复用。 - **commons-pool.jar**, **commons-dbcp.jar**:Apache Commons下的连接池组件,主要用于管理...

    java持久层API[归类].pdf

    JPA通过提供一套标准API,使得开发人员可以方便地实现数据的持久化操作而无需关注底层细节。 #### 二、JPA简单实例介绍 本章节将通过一个简单的示例来介绍如何使用JPA将数据库中的数据显示出来。主要包括以下几个...

    Hibernate学习笔记

    Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了轻量级的对象封装,让Java程序员能够用对象编程思维操作数据库。Hibernate不仅适用于Java客户端程序,也适用于Web应用,特别是能够在EJB架构中...

    java持久层API[参照].pdf

    JPA通过提供一套标准API,使得开发人员可以方便地实现数据的持久化操作而无需关注底层细节。 #### 二、JPA简单实例目标 本章节的目标是使用Java持久性API把数据库中的数据显示出来。为了达到这一目的,我们需要遵循...

    spring+struts+hibernate+dwr+jstl做的实例

    完全由Spring接管DWR AJAX处理(不需要配置dwr.xml)等技术点 源码在/mytest/WEB-INF/src下 Winxp sp3+JDK1.6+Tomcat 6.0下运行通过 因文件长度限制,未加入相关类库,请自行加入,需要的类库有: dom.jar...

    spring-hibernate-dwr实例

    collections-2.1.1.jar commons-logging-1.0.4.jar dom4j-1.6.1.jar ehcache-1.1.jar hibernate3.jar jaas.jar jaxen-1.1-beta-7.jar jdbc2_0-stdext.jar jta.jar log4j-1.2.11.jar ...

Global site tag (gtag.js) - Google Analytics