您的位置:首页 > 运维架构 > 网站架构

SSH架构中记录操作日志

2009-10-13 14:03 246 查看
在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来做那就无奈了。
这种方案设计可以一次编写,终身使用,不受项目的模块增减影响。代码量小,维护容易。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: