JAVA中数据库事务处理的实现

合集下载

如何用Java编写一个简单的数据库应用程序

如何用Java编写一个简单的数据库应用程序

如何用Java编写一个简单的数据库应用程序Java是一个非常强大的编程语言,它提供了多种处理数据库的方案。

下面我们将介绍如何用Java编写一个简单的数据库应用程序。

1.安装Java开发环境(JDK):首先,你需要安装Java开发环境(Java Development Kit,JDK)。

你可以从Oracle官方网站上下载最新版本的JDK,并按照它们提供的说明进行安装。

2.设置环境变量:一旦JDK安装完毕,你需要设置相应的环境变量。

在Windows系统中,你可以在“系统属性”中找到“高级”选项卡,点击“环境变量”,并添加JAVA_HOME变量指向JDK的安装路径。

3.下载并安装数据库:Java支持多种数据库,例如MySQL、Oracle和PostgreSQL。

你可以选择其中一个作为你的数据库。

在这个教程中,我们将使用MySQL作为示范。

从MySQL官方网站下载并安装最新版本的MySQL。

4.连接数据库:一旦数据库安装完毕,你需要编写Java代码来连接数据库。

首先,你需要下载MySQL JDBC驱动程序。

你可以从MySQL官方网站上找到最新版本的驱动程序,并将其添加到你的项目中。

接下来,你需要使用编程语言的`import`语句将这个驱动程序导入到你的Java代码中。

5.建立数据库连接:在你的Java代码中,你需要使用JDBC驱动程序提供的API来建立数据库连接。

这包括创建一个Connection对象,并传入数据库的URL、用户名和密码。

```javaimport java.sql.*;public class Main {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String user = "root";String password = "mypassword";try {Connection conn = DriverManager.getConnection(url, user, password);System.out.println("Connected to the database");} catch (SQLException e) {System.out.println("An error occurred");e.printStackTrace();}}}```在上面的代码中,`url`变量指定了数据库的URL,`user`和`password`变量指定了连接数据库所需的用户名和密码。

java事务详解

java事务详解

Java事务详解事务事务是用户定义的一个操作序列。

事务认为,这些操作序列是一个不可分割的工作单位。

事务有四个特点:原子性、一致性、隔离性和持久性。

用一句话来表述:一个业务要么全部成功,要么全部失败。

事务的原子性,表示事务执行过程中,用户定义的操作序列要么全部执行成功,要么全部执行失败。

事务的一致性,表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态,这称为事务回滚。

事务的隔离性,表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。

事务的持久性,表示事务完成之后,对系统的影响是永久性的。

如果已提交的数据在事务执行失败时,数据的状态都应该正确。

使用事务时,要求数据库引擎必须是InnoDB 引擎JDBC实现事务的方式1、保证一个业务的所有更新操作中。

所使用的连接对象是同一个连接对象2、将连接对象的提交方式设置为手动提交。

con.setAutoCommit(false);通过mit()提交事务如果有异常发送时,可以通过com .rollback()回滚事务事务的并发问题当两个或两个以上的线程,同时访问同一条记录时,就存在事务并发问题,可能造成数据混乱。

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的就是脏数据。

2、不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

3、幻读:事务A对数据库的数据进行批量操作。

事务B完成记录的添加,这时新加的记录可能就没有进行事务A的批量操作。

这就是幻读。

解决事务并发问题,需要采用事务隔离级别来进行。

READ_UNCOMMITTED:未提交读,该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。

该级别不能防止脏读,不可重复读和幻读。

READ_COMMITTED:提交读,该隔离级别表示一个事务只能读取另一个事务已经提交的数据。

如何使用事务处理实现数据同步与数据更新

如何使用事务处理实现数据同步与数据更新

如何使用事务处理实现数据同步与数据更新事务处理是一种处理数据库中多个操作的技术,可以确保这些操作要么全部成功执行,要么全部失败回滚。

数据同步与数据更新是数据库管理中常见的需求,可以通过事务处理来实现。

1.了解事务处理的基本概念事务处理的核心是ACID(原子性、一致性、隔离性和持久性)原则。

原子性表示一个事务中的所有操作要么全部成功执行,要么全部失败回滚;一致性表示事务前后数据库的状态必须是一致的;隔离性表示事务执行时对其他事务的操作是隔离的;持久性表示一旦事务提交,其对数据库的修改将永久保存。

2.设计数据库的结构和表在实现数据同步和数据更新之前,首先需要设计数据库的结构和表。

确定需要同步和更新的数据类型和字段,并为其创建相应的表和索引。

3.创建事务处理的逻辑事务处理的逻辑可以通过编程语言(如Java、Python)或数据库的存储过程来实现。

下面以Java为例,介绍事务处理的实现步骤。

(1)连接到数据库:通过数据库连接字符串、用户名和密码等参数连接到数据库。

(2)开启事务:使用数据库连接对象开启一个事务。

(3)执行数据同步和数据更新的操作:根据需求编写相应的SQL语句,执行数据同步和数据更新的操作。

数据同步操作可以通过查询源数据库的数据并插入到目标数据库中来实现;数据更新操作可以通过更新操作的SQL语句来实现。

(4)提交或回滚事务:根据操作结果决定是提交事务还是回滚事务。

如果所有操作成功执行,则提交事务;如果任何一个操作失败,则回滚事务,撤销之前的所有操作。

(5)关闭数据库连接:无论事务是提交还是回滚,都要确保关闭数据库连接,释放资源。

4.处理事务的异常情况事务处理中会出现各种异常情况,如数据库连接失败、执行操作失败等。

在处理事务的过程中,需要捕获这些异常并进行相应的处理。

例如,如果数据库连接失败,可以重试连接或记录错误日志;如果执行操作失败,可以回滚事务并记录错误日志。

5.设置事务隔离级别6.定期监控和维护数据同步和数据更新的状态定期监控数据同步和数据更新的状态,及时发现和处理异常情况。

浅析Java中的数据库访问

浅析Java中的数据库访问

浅析Java中的数据库访问摘要:随着互联网的发展,数据规模增大,对于数据库的需求越来越高。

Java作为一种流行的开发语言,拥有丰富的数据库访问接口和工具,使得开发与数据库交互的应用程序变得更加容易和高效。

本文将从Java中的数据库访问基础、连接管理、数据的增删改查、事务管理等方面进行深入浅出的介绍和分析。

关键词:Java;数据库;访问;连接管理;增删改查;事务管理正文:一、Java中的数据库访问基础Java连接数据库主要依赖于JDBC(Java Database Connectivity),它是Java平台上用于执行SQL语句的API。

通过JDBC,Java应用程序可以与关系型数据库建立连接,执行SQL语句,访问和处理数据。

JDBC主要由以下几个核心组件组成:1、驱动程序(Driver):驱动程序用于建立Java应用程序和数据库之间的通信桥梁。

可以通过四种不同的方式加载驱动程序:使用DriverManager、使用Class.forName()、使用JNDI以及使用服务提供者机制。

2、连接(Connection):连接是指应用程序和数据库之间的物理通道。

在使用JDBC时,首先需要建立一个到数据库的连接对象。

3、语句(Statement):语句用于向数据库发送SQL查询或更新。

4、结果集(ResultSet):当执行一个查询语句时,可以检索到一个或多个结果集。

结果集通常用于在应用程序中呈现查询结果。

二、连接管理连接管理是指如何管理Java应用程序和数据库之间的连接。

在JDBC中,连接管理主要包括以下两个方面:连接的建立和关闭以及连接池的使用。

1、连接的建立和关闭在连接数据库时,连接对象是需要显式地规划,连接建立后也需要显式地关闭,以防止连接泄露。

在Java应用程序中,可以使用JDBC的connection.close()方法关闭连接对象。

2、连接池的使用连接池是一种重用连接的机制,它可以在应用程序运行时提供和维护一组预定大小的连接。

在Java中使用JPA进行数据库操作

在Java中使用JPA进行数据库操作

在Java使用JPA行数据库操作Java Persistence API (JPA) 是Java EE 平台中用于ORM的标准API。

使用JPA,你可以将Java 对象映射到数据库表中,并可以轻松地进行查询和更新操作。

以下是在Java 中使用JPA 进行数据库操作的基本步骤:1.添加依赖:首先,你需要在项目中添加JPA 的依赖。

如果你使用Maven,可以在pom.xml文件中添加如下依赖:xml复制代码<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.31.Final</version></dependency>2.配置数据源:在项目中配置数据源。

如果你使用Maven,可以在pom.xml文件中添加如下依赖:xml复制代码<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency>然后在src/main/resources目录下创建persistence.xml文件,内容如下:xml复制代码<persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL"><properties><property name="hibernate.connection.driver_class"value="com.mysql.cj.jdbc.Driver" /><property name="hibernate.connection.url"value="jdbc:mysql://localhost:3306/mydatabase" /><property name="ername"value="username" /><property name="hibernate.connection.password"value="password" /></properties></persistence-unit>3.创建实体类:创建一个实体类,并通过注解来定义它与数据库表之间的映射关系。

详解Java分布式事务的6种解决方案

详解Java分布式事务的6种解决方案

详解Java分布式事务的6种解决⽅案介绍在分布式系统、微服务架构⼤⾏其道的今天,服务间互相调⽤出现失败已经成为常态。

如何处理异常,如何保证数据⼀致性,成为微服务设计过程中,绕不开的⼀个难题。

在不同的业务场景下,解决⽅案会有所差异,常见的⽅式有:1. 阻塞式重试;2. 2PC、3PC 传统事务;3. 使⽤队列,后台异步处理;4. TCC 补偿事务;5. 本地消息表(异步确保);6. MQ 事务。

本⽂侧重于其他⼏项,关于 2PC、3PC 传统事务,⽹上资料已经⾮常多了,这⾥不多做重复。

阻塞式重试在微服务架构中,阻塞式重试是⽐较常见的⼀种⽅式。

伪代码⽰例:m := db.Insert(sql)err := request(B-Service,m)func request(url string,body interface{}){for i:=0; i<3; i ++ {result, err = request.POST(url,body)if err == nil {break}else {log.Print()}}}如上,当请求 B 服务的 API 失败后,发起最多三次重试。

如果三次还是失败,就打印⽇志,继续执⾏下或向上层抛出错误。

这种⽅式会带来以下问题1. 调⽤ B 服务成功,但由于⽹络超时原因,当前服务认为其失败了,继续重试,这样 B 服务会产⽣ 2 条⼀样的数据。

2. 调⽤ B 服务失败,由于 B 服务不可⽤,重试 3 次依然失败,当前服务在前⾯代码中插⼊到 DB 的⼀条记录,就变成了脏数据。

3. 重试会增加上游对本次调⽤的延迟,如果下游负载较⼤,重试会放⼤下游服务的压⼒。

第⼀个问题:通过让 B 服务的 API ⽀持幂等性来解决。

第⼆个问题:可以通过后台定时脚步去修正数据,但这并不是⼀个很好的办法。

第三个问题:这是通过阻塞式重试提⾼⼀致性、可⽤性,必不可少的牺牲。

阻塞式重试适⽤于业务对⼀致性要求不敏感的场景下。

java事务实现方式

java事务实现方式
在Java中,事务是一组操作单元,它们被当作一个单一的工作单元来执行。

事务管理是确保数据库操作的一致性和可靠性的重要组成部分。

Java中常见的事务实现方式包括:
1、JDBC事务:
使用java.sql.Connection对象,通过调用setAutoCommit(false)来启用手动事务管理。

使用commit()提交事务或rollback()回滚事务。

2、Spring声明式事务管理:
使用@Transactional注解来声明事务。

配置事务管理器( 如DataSourceTransactionManager)。

3、使用Spring编程式事务管理:
使用TransactionTemplate来编程式管理事务。

4、JTA事务 Java(Transaction(API):
使用erTransaction接口。

通常用于分布式事务,涉及多个数据源。

这些是一些常见的Java事务实现方式,选择适合你应用场景的方式取决于你的需求和技术栈。

java mongodb 事务回滚方法

Java中使用MongoDB进行事务管理时,遇到事务出错需要进行回滚的情况是比较常见的。

在这种情况下,程序员需要采取相应的方法来实现事务的回滚操作,以确保数据的一致性和完整性。

本文将介绍在Java中使用MongoDB实现事务回滚的方法,希望对开发人员在实际项目中处理事务回滚问题时有所帮助。

一、了解MongoDB事务管理在使用MongoDB进行数据存储时,为了确保数据操作的原子性和一致性,通常会涉及到事务管理的问题。

事务管理主要涉及到事务的开启、提交和回滚三个操作。

在Java中,可以通过MongoDB提供的驱动程序来实现对数据库事务的管理操作。

二、事务回滚的基本原理事务回滚是指在事务执行过程中,当事务遇到错误或异常时,需要将事务执行的操作进行撤销,恢复到事务开始执行前的状态。

在MongoDB中,事务回滚需要通过相应的API进行操作。

通常情况下,事务回滚需要借助异常处理机制来实现。

三、在Java中实现事务回滚的方法在Java中,可以通过以下几种方法来实现MongoDB事务的回滚操作:1. 使用try-catch-finally语句块处理回滚在事务执行的过程中,将事务的操作代码放在try块中,当捕获到异常时,在catch块中执行事务的回滚操作,对数据库进行数据的恢复操作,最后在finally块中释放资源。

下面是一个简单的示例代码:```javatry {// 开启事务session.startTransaction();// 执行事务操作// ...// 提交事务sessionmitTransaction();} catch (Exception e) {// 回滚事务session.abortTransaction();// 处理异常// ...} finally {// 释放资源session.close();```2. 使用Spring框架的事务管理在使用Spring框架的情况下,可以通过Spring提供的事务管理来实现事务的回滚操作。

编程式事务 java 写法

在Java中,编程式事务通常通过使用java.sql.Connection对象和javax.sql.DataSource对象来实现。

以下是一个简单的示例:java复制代码import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;public class TransactionExample {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt = null;try {// 1. 获取数据源连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");// 2. 开启事务conn.setAutoCommit(false);// 3. 执行SQL语句String sql1 = "UPDATE account SET balance = balance - 100 WHERE name = 'Alice'";pstmt = conn.prepareStatement(sql1);pstmt.executeUpdate();String sql2 = "UPDATE account SET balance = balance + 100 WHERE name = 'Bob'";pstmt = conn.prepareStatement(sql2);pstmt.executeUpdate();// 4. 提交事务mit();} catch (SQLException e) {// 5. 回滚事务if (conn != null) {try {conn.rollback();} catch (SQLException ex) {ex.printStackTrace();}}e.printStackTrace();} finally {// 6. 关闭资源if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}在这个示例中,我们首先通过DriverManager获取数据源连接,然后通过调用setAutoCommit(false)方法关闭自动提交,开启事务。

java事务实现原理

Java事务的实现原理主要依赖于数据库连接的ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

1.原子性:事务被视为一个最小的单一工作单元,事务内的操作要么全部完成,要么全部不完成。

这意味着事务中的每个操作要么全部成功,要么全部失败,没有中间状态。

2.一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。

这表示在事务开始之前和事务结束以后,数据库必须满足所有设置的约束条件。

隔离性:多个事务并发执行时,一个事务的操作不应影响其他事务。

隔离级别有读未提交、读已提交、可重复读和串行化四种,其中读未提交级别最低,串行化级别最高。

3.持久性:一旦事务提交,则其结果永久保存在数据库中。

即使系统崩溃,重新启动后数据库还能恢复到提交事务后的状态。

在Java中,可以通过JDBC和JTA两种方式实现事务。

JDBC是Java中用于连接数据库的API,通过Connection对象开启、执行和提交事务。

JTA是Java中用于分布式事务的API,通过TransactionManager和UserTransaction两个接口实现分布式事务的管理和操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java中数据库事务处理的实现摘要本文介绍在Java中进行事务处理的方法,通过实例分别讲述了如何采用JavaBean、Ejb组件实现J2EE应用服务器支持的JDBC事务、JTA(Java Transaction API)事务。

关键词JavaBean,EJB,数据库,事务处理,JTAJavaBeanJavaBean是用Java语言编写的与平台无关的组件。

它是描述Java的软件组件模型,有点类似于Microsoft的COM组件的概念。

在Java模型中,通过JavaBean可以无限扩充Java程序的功能,通过JavaBean的组合可以快速的生成新的应用程序。

JavaBean可以实现代码的重复利用,对于程序的易维护性也有重大的意义。

非可视化的JavaBean,在JSP程序中常用来封装事务逻辑、数据库操作等,可以很好的实现业务逻辑和前台程序的分离。

JavaBean在服务器端的应用方面表现出了越来越强的生命力。

EJBEJB技术定义了一组可重用的组件:Enterprise JavaBeans。

你可以利用这些组件,像搭积木一样的建立你的分布式应用程序。

当你把代码写好之后,这些组件就被组合到特定的文件中去。

每个文件有一个或多个Enterprise Beans,在加上一些配置参数。

最后,这些Enterprise Beans被配置到一个装了EJB容器的平台上。

客户能够通过这些Beans的home接口,定位到某个beans,并产生这个beans的一个实例。

这样,客户就能够调用Beans的应用方法和远程接口。

EJB技术简化了用JAVA语言编写的企业应用系统的开发、配置和执行。

有三种类型的Enterprise beans:Session beans、entity beans和Message-driven Beans。

事务处理信息是任何企事业单位的重要资产,任何企业部门都包含着信息的流入、流出,任何企业部门都控制着某些信息。

同时,信息必须在适当的时机传播给需要的人。

而且,信息还需要安全约束,通常根据信息的类型和内容实施访问控制。

为了保证数据的安全有效和正确可靠,数据库管理系统(DBMS)必须提供统一的数据保护功能。

事务是现代数据库理论中的核心概念之一。

如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。

当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。

由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚(回到最初的系统状态)。

事务必须服从ISO/IEC所制定的ACID原则。

ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。

事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。

一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。

隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。

持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。

在下面我们列举一个使用SQL Server数据库进行事务处理的例子。

主表是一个规章制度信息表(bylaw),主要字段有记录编号、标题、作者、书写日期等。

两个子表分别是附件表(bylaw_affix)和文本信息表(bylaw_content)。

表结构见图1所示。

bylaw表的记录编号与bylaw_affix 表的记录编号、bylaw_content表的记录编号是对应的,每次对规章制度信息的操作也就是对这三个表的联合操作。

例如要删除规章制度中的一条记录,如果不使用事务,就可能会出现这样的情况:第一个表中成功删除后,数据库突然出现意外状况,而第二、三个表中的操作没有完成,这样,删除操作并没有完成,甚至已经破坏数据库中的数据。

要避免这种情况,就应该使用事务,它的作用是:要么三个表都操作成功,要么都失败。

换句话说,就是保持数据的一致性。

所以,为了确保对数据操作的完整和一致,在程序设计时要充分考虑到事务处理方面的问题。

图1示例表结构Java中的事务处理一般情况下,J2EE应用服务器支持JDBC事务、JTA(Java Transaction API)事务、容器管理事务。

一般情况下,最好不要在程序中同时使用上述三种事务类型,比如在JTA事务中嵌套JDBC事务。

第二方面,事务要在尽可能短的时间内完成,不要在不同方法中实现事务的使用。

下面我们列举两种事务处理方式。

1、JavaBean中使用JDBC方式进行事务处理在JDBC中怎样将多个SQL语句组合成一个事务呢?在JDBC中,打开一个连接对象Connection时,缺省是auto-commit模式,每个SQL语句都被当作一个事务,即每次执行一个语句,都会自动的得到事务确认。

为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。

在auto-commit模式屏蔽掉之后,如果不调用commit()方法,SQL语句不会得到事务确认。

在最近一次commit()方法调用之后的所有SQL会在方法commit()调用时得到确认。

2、SessionBean中的JTA事务JTA是事务服务的J2EE解决方案。

本质上,它是描述事务接口(比如UserTransaction接口,开发人员直接使用该接口或者通过J2EE容器使用该接口来确保业务逻辑能够可靠地运行)的J2EE模型的一部分。

JTA具有的三个主要的接口分别是UserTransaction接口、TransactionManager接口和Transaction接口。

这些接口共享公共的事务操作,例如commit()和rollback(),但是也包含特殊的事务操作,例如suspend(),resume()和enlist(),它们只出现在特定的接口上,以便在实现中允许一定程度的访问控制。

例如,UserTransaction能够执行事务划分和基本的事务操作,而TransactionManager能够执行上下文管理。

应用程序可以调用UserTransaction.begin()方法开始一个事务,该事务与应用程序正在其中运行的当前线程相关联。

底层的事务管理器实际处理线程与事务之间的关联。

mit()方法终止与当前线程关联的事务。

UserTransaction.rollback()方法将放弃与当前线程关联的当前事务。

Last Modified:2004.04.04JBoss的集群策略分析(来源:)序言在阅读本文前,请确定您有以下基础,否则您可能会是在浪费您的时间:1、了解J2EE的一些基本概念2、了解集群的基本概念3、对JBOSS有一些大致的了解,可到上下载它。

JBOSS是一个开放源码的、基于J2EE规范的应用服务器,它实现了大多数的J2EE规范,除此之外,它还提供了一些J2EE中所没有涉及到的企业级功能,例如集群。

本文主要描述JBOSS采取的集群策略,并重点介绍它的负载平衡与失效转发机制。

由于JBOSS是一个建立在J2EE规范上的应用服务器,因此在开始之前,我们还是简单地介绍一下J2EE规范:J2EE是一套针对于企业级分布式应用的计算环境,它定义了动态WEB页面功能(servlet和jsp),商业组件(EJB),异步消息传输机制(JMS),名称和目录定位服务(JNDI),数据库访问(JDBC),与子系统的连接器(JCA),安全服务等等。

但美中不足的是J2EE并没有定义一些企业级应用所必须的规范,例如集群,所以集群的实现只能由各厂商自行来设计实现。

要实现基于J2EE规范的集群,我们通常要做如下考虑:集群的管理、负载平衡、失效转发、服务端状态的复制(例如JSP 中的session),还要考虑同步和异步的问题(例如JMS服务就是异步方式)。

如果要对这些内容做一个全面的阐述的话,估计可以写成一本书了:)因此本文主要探讨的是:怎样实现无状态EJB的负载平衡与失效转发机制?1999年,Marc Fleury建立了JBOSS开源项目,现在它有差不多100个活跃的开发者,30个核心开发者,每月高达35万次的下载量,它当前的最高稳定版是3.2版,4.0版正在稳定之中,自从JBOSS3.0开始就加入了集群技术,几乎能对任何J2EE 规范进行集群管理,如JNDI、JSP中的session、EJB等等。

更令人振奋的是,即将发行的JBOSS4.0将会对JMS也加入集群管理特色。

EJB集群在JBOSS中的实现下面言归正传,上图大致描述了一个客户端调用JBOSS中的EJB的过程。

在JBOSS 中,客户端并不直接调用EJB对像,而采用了一个迂回的方法,更专业的说是一种设计模式――代理模式,真正与客户端交互的是一个代理对像①,这个代理对像一般由客户端通过JNDI技术来取得的。

而具体的代理对像的实现就由各厂商自完成了,在JBOSS中,一个代理对像是一段精心设计的复杂代码。

但在客户端看来,调用一个代理对像好像就是在调用那个实际的EJB对像,虽然事实并非如此。

在这里JBOSS耍了一个小把戏,代理对像虽然实现了与EJB对像相同的接口,但它实际上是把客户端对它的调用转发到了它在服务端的另一个伙伴身上②,同时,这个伙伴同样定义了客户端所要求的一些EJB接口,当这些接口被调用时③,精彩的部分开始了,JBOSS把客户端发过来的各种各样不同的调用全部转换成为一个统一格式的接口④(在本文中我们暂且称客户端发出的调用为应用级接口,而JBOSS生成的统一格式的接口称为系统级接口)。

当转换完成后,所有的应用级接口变成了系统级接口⑤。

为了能更清楚地阐述这个问题,我们假设客户端向EJB对像发出如下调用:myRemoteComponent.increaseSalary(100);//myRemoteComponent为代理对像这个调用实际上被JBOSS转换成了如下的系统级调用:proxyClientContainer.invoke(invocation);//proxyClientContainer为代理对像在服务端的另一个伙伴但这个invocation到底是什么呢?实际上它是类Invocation的一个实例,这里有它的一个简单的说明:public class Invocation{Object[]args;//应用级接口中的一些参数Method method;//被调用的应用级接口Map payload;//JBOSS就是在这里采取的负载平衡策略的……}当应用级接口被转换成为了系统级接口之后,它将经过一系列的拦截器(⑥至⑦)。

在这里我首先要说明一下什么是拦截器,实际上,它是JBOSS中独具特色的一个设计思路,一个拦截器就好像是一张过滤网,它用来对客户端的调用进行拦截,并对其进行一些处理,比如检查客户端调用的合法性、实现安全策略、对事务进行支持等。

相关文档
最新文档