软件项目实训及课程设计指导——如何在项目中实现日志、事务功能

核心提示软件项目实训及课程设计指导——如何在J2EE平台项目中实现交易日志、事务控制等功能1.1 基于面向切面AOP设计思想的系统架构设计实现交易日志的应用示例1、面向对象OOP设计中的“开-闭”设计原则随着软件应用系统的规模不断地增大,从而给系统

软件培训和课程设计指导——如何在J2EE平台项目中实现交易日志、交易控制等功能

1.1基于面向切面的AOP设计思想的系统架构设计的事务日志应用实例

1.面向对象程序设计中的“开-闭”设计原则

随着软件应用系统规模的不断扩大,给系统维护人员对软件应用系统的维护和修改带来了一定的复杂性。这种系统运维上的困境促使Bertrand Meyer的思想,在1998年提出了面向对象OOP设计中的“开-闭”原则。

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

这种设计原则要求软件应用系统的开发者在不修改现有功能代码的情况下,扩展软件应用系统的软件功能。

2.基于面向方面的AOP设计思想的系统架构设计更符合“开放-封闭”的设计原则。

面向方面AOP设计思想的本质实际上是实现“分散”的编程方法——所谓分散,就是要求软件应用系统的设计者和开发者将一个通用的需求功能从软件应用系统中不相关的功能模块中分离出来,同时使其他功能模块能够共享通用的功能实现代码。

因为面向方面的AOP也提倡“封装”和“分离”,所以基于面向方面的AOP设计思想的软件应用系统的系统架构设计的可扩展性非常高。

基于面向方面AOP设计思想的软件应用系统的系统架构设计和实现的结果,更能符合“开放-封闭”的设计原则,因为目前各应用平台的面向方面AOP技术的具体实现手段是应用拦截器组件,各拦截器组件可以串联起来形成功能更复杂的应用组件。

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

3.在银行账户信息管理系统的实例项目中,基于面向方面的思想设计并实现了事务日志实例。

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

银行账户是一切金融业务的基础,是一切金融交易的门槛。无论什么样的金融交易,只要经过银行,都显示资金从一个账户转到另一个账户,会在账户记录中留下痕迹。读者还应该意识到日志记录在金融行业中的重要性。通过采用交易日志机制,加强了内部控制、监督和审计,提高了银行数据的可靠性和安全性。

为了对业务进行事后审计和跟踪,银行账户信息管理系统需要对每一笔账户变动进行详细记录,即记录业务交易的过程和结果。而追踪账户信息的技术实现,本质上是监控对数据库系统的访问,即增加、删除、更改和检查数据库表中的记录。

交易日志记录的数据格式

为了准确反映每次账户信息的变化,初步规定业务交易日志记录的数据格式为以下属性字段:交易时间、访问者IP地址、操作员工作ID、操作结果状态、操作动作、交易类型、失败原因说明、具体交易的各种业务数据。

业务事务日志功能被设计为一个单独的模块。

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

在执行一个业务功能类的具体业务方法时,使用AOP提倡的事务日志记录拦截器组件来记录事务操作的成功或失败。事务的日志记录行为主要是基于截获的业务对象中的具体业务处理方式和相关事务数据。

在执行业务对象中的特定业务处理方法中的程序代码之后,识别业务方法的运行结果的状态。如果交易成功执行,则记录与成功交易相关的日志信息;如果在事务执行期间抛出异常,将记录有关事务失败的日志信息。

1.2基于面向方面的AOP设计思想的系统架构设计的事务控制应用实例

1.事务控制技术可以保证系统数据访问的一致性。

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

比如,在银行账户信息管理系统转账功能的实现中,如果技术不合理,一个存款人账户的资金会减少,而另一个存款人账户的资金不会增加。为保证系统数据库表中数据的一致性,需要合理调度和控制多个存款人对系统数据库的并发访问。调度和控制的基本单元是事务控制技术的应用。下图是银行账户信息管理系统中保证转账功能正确性的交易控制技术的工作原理。

因为事务是存款人在账户数据库表中的一组顺序的数据访问操作,并且事务具有ACID的四个特征。因此,软件应用系统的设计者和开发者通过合理地使用事务控制技术,可以保证应用系统业务处理过程中数据的一致性和业务逻辑的正确性。

2.JDBC API系统库也为事务控制技术提供支持。

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

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

JDBC的事务特性主要体现在:当打开一个数据库连接对象时,默认模式是自动提交。也就是说,对数据库的一个update SQL语句代表一个事务操作。操作成功后,数据库系统会自动调用commit进行提交,否则会调用rollback进行来回回滚。

因此,为了将几个不同的SQL语句组合成一个事务,实现更复杂的数据访问操作,软件应用系统的开发者需要在其编程代码中屏蔽自动提交模式。但是JDBC API只支持本地事务——针对单个数据库的操作,不支持分布式事务处理的需求——所以应该采用Java事务API。分布式事务处理的技术支持。

3.基于JDBC API的交易控制程序代码示例

在基于JDBC API的事务控制实现的开发中,软件应用系统的开发人员可以通过调用连接类中的setAutoCommit方法来禁止自动提交。之后,可以将对数据库进行操作的多个SQL语句视为一个独立的事务,然后在数据库访问操作完成后调用commit方法提交整个事务。如果某个SQL语句表示的函数操作失败,则不会执行commit方法,并且会生成一个异常作为响应。此时,可以在异常捕获的程序代码中调用rollback方法,回滚并恢复修改后的相关数据。

以下程序是基于JDBC API的事务控制实现的代码示例。请注意粗体的陈述。

public boolean insertOneUserInfo抛出WebBBSException{

String insertUserInfoSql= "插入userInfo值";

string insertUserContactInfoSql = " insert into UserContactInfo values ";

尝试{

connection conn = driver manager . get connection;

con . set auto commit;

prepared statement PST mt1 = con . prepare statement;

//参数赋值代码,此处省略

PST mt 1 . execute update;

prepared statement pstmt 2 = con . prepare statement;

//参数赋值代码,此处省略

pstmt 2 . execute update;

con.commit

}

接住{

尝试{

con .回滚;

}

接住{

//异常处理代码,此处省略

}

最后{

尝试{

con . set auto commit;

}

接住{

//异常处理代码,此处省略

}

}

返回true

}

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

4.基于JDBC API事务控制技术的程序代码中反映的问题

由于事务控制需要在多个不同的数据访问组件中提供,如果采用常规的JDBC事务实现方式,上述示例程序中的粗体代码必然会在不同的数据访问组件中重复出现;而且事务控制的代码和具体系统数据库表数据访问的DAO组件代码相互交叉,维护和修改相关程序代码比较困难。

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

5.基于面向方面的思想,设计并实现银行账户信息管理系统中数据访问的事务控制。

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

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

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

但是开发者的动态代理类必须实现Java . lang . reflect . invocation handler接口,并在实现的invoke方法中实现其代理功能。

 
友情链接
鄂ICP备19019357号-22