SSH架构中记录操作日志

来源:互联网 发布:和淘宝联盟一样的软件 编辑:程序博客网 时间:2024/05/07 01:56

在SSH环境下,如果将数据库操作事务交给Spring管理,那么记录操作日志就容易了: 

1、尽量使用注解声明事务; 

2、写一个类扫描使用了事务的方法。根据楼主提出的技术需求分析,只有写入动作才需要记录,同样数据库只有写入才需要事务,读取不需要,所以在不需要事务的方法上面标注@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样可以精确过滤出需要记录日志的方法; 

3、利用AOP编程实现日志记录功能。 

时间:AOP切入点处取系统时间 

操作员和IP:控制层在session作用域里取得用户对象和request取IP地址传给切入点 

操作:可以在操作数据库的DAO组件上(方法)用自定义注解标上,例如:@Operation=INSERT|DELETE|UPDATE...只要读取到这个配置就知道操作类型。当然也可以利用Hibernate来得知,得要看Hibernate的源代码。 

结果:事务成功即成功,事务回滚即失败。 

业务数据ID:这个有两种解决方法,一种笨拙的办法是所有的数据模型层的实体对象都抽取ID到父类;二是实体映射的配置方法采用注解方式,这样可以写一个类扫描出实体的ID字段和类型,自然能记录之。 

粒度问题:首先只要应用到事务的地方都可以记录之,批量操作数据行实际是循环调用DAO组件,也就实现了批量记录。当然,如果送批量SQL语句到数据库,由DBMS来做那就无奈了。 

这种方案设计可以一次编写,终身使用,不受项目的模块增减影响。代码量小,维护容易。

在SSH环境下,如果将数据库操作事务交给Spring管理,那么记录操作日志就容易了: 

1、尽量使用注解声明事务; 

2、写一个类扫描使用了事务的方法。根据楼主提出的技术需求分析,只有写入动作才需要记录,同样数据库只有写入才需要事务,读取不需要,所以在不需要事务的方法上面标注@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样可以精确过滤出需要记录日志的方法; 

3、利用AOP编程实现日志记录功能。 

时间:AOP切入点处取系统时间 

操作员和IP:控制层在session作用域里取得用户对象和request取IP地址传给切入点 

操作:可以在操作数据库的DAO组件上(方法)用自定义注解标上,例如:@Operation=INSERT|DELETE|UPDATE...只要读取到这个配置就知道操作类型。当然也可以利用Hibernate来得知,得要看Hibernate的源代码。 

结果:事务成功即成功,事务回滚即失败。 

业务数据ID:这个有两种解决方法,一种笨拙的办法是所有的数据模型层的实体对象都抽取ID到父类;二是实体映射的配置方法采用注解方式,这样可以写一个类扫描出实体的ID字段和类型,自然能记录之。 

粒度问题:首先只要应用到事务的地方都可以记录之,批量操作数据行实际是循环调用DAO组件,也就实现了批量记录。当然,如果送批量SQL语句到数据库,由DBMS来做那就无奈了。 

这种方案设计可以一次编写,终身使用,不受项目的模块增减影响。代码量小,维护容易。