首页 » 软件开发 » 软件项目实训及课程设计指导——如何在项目中实现日志、事务功能(事务系统软件控制切面)

软件项目实训及课程设计指导——如何在项目中实现日志、事务功能(事务系统软件控制切面)

雨夜梧桐 2024-07-24 18:32:37 0

扫一扫用手机浏览

文章目录 [+]

随着软件应用系统的规模不断地增大,从而给系统维护人员对软件应用系统的维护和修改带来一定的复杂性,这种系统运维工作中的困境促使Bertrand Meyer(贝特朗·梅耶,对象技术大师,发明了Eiffel 语言和按契约设计(Design by Contract)的思想,在1998年提出了面向对象OOP设计中的"开放—封闭"原则。

Bertrand Meyer也是名著《面向对象软件构造》的作者,法国工程院院士。

该设计原则要求软件应用系统的开发人员可以在不修改软件应用系统中现有的功能代码的前提下(不必改动源程序代码或者二进制程序代码、模块的二进制可执行版本,无论是可链接的库、DLL或者Java的.jar包文件,都无需要改动),而实现对软件应用系统的软件功能进行功能方面的扩展。

软件项目实训及课程设计指导——如何在项目中实现日志、事务功能(事务系统软件控制切面) 软件开发
(图片来自网络侵删)

2、基于面向切面AOP设计思想的系统架构设计能够更好地满足"开-闭"设计原则

面向切面AOP设计思想的本质其实是实现"分散(离)关注"的编程方法——所谓的分离关注就是要求软件应用系统的设计和开发实现人员要将软件应用系统中某一通用的需求功能从不相关的各个功能模块中分离出来,同时也能够使得其它的功能模块共享这个通用的功能实现代码。

由于面向切面AOP也同样倡导"封装"和"分离",因此基于面向切面AOP设计思想的软件应用系统的系统架构设计实现结果的可扩展性是非常高的。

基于面向切面AOP设计思想的软件应用系统的系统架构设计实现结果能够更好地满足"开-闭"设计原则,因为目前各个应用平台对面向切面AOP技术的具体实现手段是应用拦截器组件、并且各个拦截器组件可以相互串接组合成为更复杂功能的应用组件。

因此,当软件应用系统的需求发生变化时,运维人员可以通过替换原有的拦截器组件或者添加新的拦截器组件的方式适应系统需求的变化。

3、在银行账户信息管理系统的示例项目中基于面向切面思想设计和实现交易日志示例

(1)银行账户信息管理系统需要提供对业务交易日志记录的功能

银行账户是开展各项金融业务的基础,是一切金融交易的门槛,不论什么样的金融交易,只要通过银行,都表现为资金从一个账户到另一个账户的转移,都会在账户记录中留下痕迹。
读者对金融行业中的日志记录的重要性也应该有所了解,通过采用交易日志机制等,加强内部制约和监督、审计,提高了银行业务数据的可靠性和安全性。

为了事后的业务审计和跟踪,银行账户信息管理系统有必要对每次的账户变化的情况进行详细的记录,也就是需要对业务交易的过程和结果进行日志记录。
但对账户信息跟踪的技术实现本质是监控对数据库系统的访问,也就是对数据库表中的记录的增、删、改和查等方面的功能操作。

(2)业务交易日志记录的数据格式

为了能够准确地反映每次的账户信息的变化状况,初步规定业务交易日志记录的数据格式为下面的各个属性字段:交易时间、访问者的IP地址、操作员的工号ID、操作结果的状态(成功或者失败)、操作动作(增加、修改还是删除)、交易类型(存钱、取钱还是转账)、失败原因说明、具体交易的各种业务数据。

(3)将业务交易日志记录的功能单独设计为一个模块

为了避免在各个业务功能模块中直接藕合和重复地编程实现业务交易日志记录的功能代码,在银行账户信息管理系统的架构设计方面应用面向切面的设计思想,业务交易日志记录的功能单独设计为一个模块——交易日志记录拦截器组件。

当某个业务功能类的具体业务方法执行后,通过面向切面AOP所倡导的后置形式的交易日志记录拦截器组件实现在交易操作成功或者失败时都进行记录。
交易日志的记录行为主要是依据被拦截的业务对象中的特定的业务处理方法和有关的交易数据。

在执行业务对象中的特定业务处理方法中的程序代码后,识别业务方法的操作结果的状态(成功或者失败)。
如果交易成功执行后,则记录交易成功有关的日志信息;如果交易执行过程中抛出异常,则记录交易失败有关的日志信息。

1.1.2 基于面向切面AOP设计思想的系统架构设计实现事务控制的应用示例

1、事务控制技术能够保证系统数据访问的一致性

在企业应用系统的设计和开发实现中,单用户操作的软件应用系统越来越少了,基本上都是多用户并发操作和并发访问软件应用系统中数据库表中的数据。
在这种应用需求的状况下,要想保证系统业务的正常进行,保证对系统数据库访问中的各种业务数据的一致性是关键。

比如在银行账户信息管理系统的转账功能实现中,如果技术实现不合理将会造成一个储户账号中的资金减少了,而另一个储户账号中的资金却没有增加。
保证系统数据库表中的数据一致性需要对多储户并发访问系统数据库进行合理的调度和控制,调度和控制的基本单位是应用事务控制技术。
下图所示为保证银行账户信息管理系统中转账功能的正确性的事务控制技术的工作原理性图示。

由于事务是储户对账户数据库表中的数据访问操作的序列集,并且事务具有ACID四个方面的特性(ACID分别代表不可分割性Atomicity、一致性Consistency、隔离性Isolation和稳定性Durability)。
因此,软件应用系统的设计和开发人员合理地应用事务控制技术能够保证应用系统业务处理过程中的数据一致性和业务逻辑的正确性。

2、在JDBC API系统库中也提供对事务控制技术的支持

与通过某种特定的数据库系统中的存储过程实现事务处理控制相比,JDBC事务处理技术可实现软件应用系统与物理数据库系统的分离,不需要系统开发人员考虑不同的物理数据库系统对事务处理的技术支持的差别,从而增强了软件应用系统的独立性。

在基于JDBC的软件应用系统的开发实现中,事务的启动是由JDBC驱动程序自动完成的,而事务的终止则可以是自动完成也可以是由软件应用系统的开发人员在代码中手动实现。
事务到底是自动终止还是手动终止这要取决于在实现的程序代码中数据库连接对象中的自动提交状态的值设置为true还是为false。

JDBC中的事务特点主要体现在:打开一个数据库连接对象(Connection)时,缺省是自动提交(Auto-Commit)模式。
也就是说,一条对数据库的更新SQL语句代表一项事务操作,操作成功后,数据库系统将自动调用commit()来提交,否则将调用rollback()来回滚。

因此,为了能够将多个不同的SQL语句组合成一个事务一实现更复杂的数据访问操作,软件应用系统的开发人员在编程代码中需要将自动提交(Auto-Commit)模式屏蔽掉。
但JDBC API只支持本地事务((Local transaction))——针对单个数据库为目标的操作,而不支持分布式事务处理的要求——此时应该要采用Java事务API (JTA,Java Transaction API)。
实现对分布式事务处理的技术支持。

3、基于JDBC API事务控制实现的程序代码示例

在基于JDBC API的事务控制实现的开发中,软件应用系统的开发人员在编程代码中可以通过调用Connection 类中的setAutoCommit(false)方法来禁止自动提交;之后就可以把对数据库操作的多个SQL语句作为一个独立的事务,在数据库访问操作完成后再调用commit()方法来进行整体的提交,倘若其中一个SQL语句所代表的功能操作失败,都不会执行commit()方法,并且将产生响应的异常;此时就可以在异常捕获的程序代码中调用rollback()方法进行回滚恢复修改的相关数据。

下面所示的程序为一个基于JDBC API事务控制实现的代码示例,请读者注意其中以黑体标示的语句。

public boolean insertOneUserInfo(UserInfoPO oneRegisterUserInfo) throws WebBBSException{ String insertUserInfoSql="insert into userInfo values(?,?,?,?,?,?,?,?)"; String insertUserContactInfoSql="insert into UserContactInfo values(?,?)"; try{ Connection conn =DriverManager.getConnection("URL","userName","userPassWord"); con.setAutoCommit(false); PreparedStatement pstmt1 = con.prepareStatement(insertUserInfoSql); // 参数赋值代码,在此省略 pstmt1.executeUpdate(); PreparedStatement pstmt2= con.prepareStatement(insertUserContactInfoSql); // 参数赋值代码,在此省略 pstmt2.executeUpdate(); con.commit(); } catch(SQLException e){ try{ con.rollback(); } catch(SQLException ex){ // 异常处理代码,在此省略 } finally{ try{ con.setAutoCommit(true); } catch(SQLException e){ // 异常处理代码,在此省略 } } } return true;}

由于基于JDBC API事务控制实现是针对同一个数据库连接对象完成的,因此该事务控制也就只适用于对单一数据库系统访问的软件应用系统中,而不适用于对多个不同的数据库系统访问的软件应用系统开发中——此时应该要应用分布式事务控制实现技术JTA。

4、在基于JDBC API事务控制技术实现的程序代码中所反映出的问题

由于需要在多个不同的数据访问组件提供事务控制,如果采用常规的JDBC事务实现方式将不可避免地会在不同的数据访问组件中重复地出现上面示例程序中的黑体部分的代码;而且事务控制的代码与具体的系统数据库表数据访问的DAO组件代码相互交合在一起,对相关的程序代码的维护和修改都是比较困难的。

为此,软件应用系统的设计人员应该要重构软件应用系统中的事务控制实现,并分离事务控制实现程序代码与具体的数据访问的程序代码之间的耦合关系。

5、在银行账户信息管理系统中基于面向切面思想设计和实现数据访问中的事务控制

Spring框架中为软件应用系统提供了声明形式和编程形式的事务控制技术的支持,软件应用系统的开发者可以应用Spring框架中对 面向切面AOP技术的支持实现事务控制——它可以在一个应该具有事务控制的方法调用前开始一个事务,在该方法返回时提交或者回滚事务。
当然,如果软件应用系统项目中没有应用Spring框架,其实也可以采用Java 语言中的动态代理技术实现分离。

所谓的动态代理类是指在程序运行时,运用Java 语言中的反射机制动态创建出。
但该动态代理类需要实现InvocationHandler接口,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理程序类。

动态代理程序类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。
动态代理类不仅简化了编程实现工作,而且也提高了软件应用系统的可扩展性,因为Java 的反射机制可以生成任意类型的动态代理类。

但开发人员的动态代理类必须要实现java.lang.reflect.InvocationHandler接口,并在实现的invoke方法中完成其代理功能的实现。

相关文章

语言中的借用,文化交融的桥梁

自古以来,人类社会的交流与发展离不开语言的传播。在漫长的历史长河中,各民族、各地区之间的文化相互碰撞、交融,产生了许多独特的语言现...

软件开发 2025-01-01 阅读1 评论0

机顶盒协议,守护数字生活的新卫士

随着科技的飞速发展,数字家庭逐渐走进千家万户。在这个时代,机顶盒成为了连接我们与丰富多彩的数字世界的重要桥梁。而机顶盒协议,作为保...

软件开发 2025-01-01 阅读1 评论0

语言基础在现代社会的重要性及方法步骤

语言是人类沟通的桥梁,是社会发展的基础。语言基础作为语言学习的基石,对于个人、社会乃至国家的发展具有重要意义。本文将从语言基础在现...

软件开发 2025-01-01 阅读2 评论0

粤语电影,传承文化,点亮时代之光

粤语电影,作为中国电影产业的一朵奇葩,以其独特的地域特色、丰富的文化内涵和鲜明的艺术风格,赢得了广大观众的喜爱。本文将从粤语电影的...

软件开发 2025-01-01 阅读3 评论0

苹果游戏语言,塑造未来娱乐体验的基石

随着科技的飞速发展,游戏产业逐渐成为全球娱乐市场的重要支柱。在我国,游戏产业更是蓬勃发展,吸引了无数玩家和投资者的目光。而在这其中...

软件开发 2025-01-01 阅读1 评论0