本发明涉及计算机,具体涉及一种基于druid的事务链路日志记录方法和系统。
背景技术:
1、在医院信息系统中,各业务模块代码通常涉及api接口所执行的业务逻辑操作,需要同时操作数据库中的多张表才能完成,同时对数据库中的多张表进行操作涉及到事务问题,在对事务问题进行处理的现有做法中,仅记录不同的业务模块接口相互调用的链路日志,无法记录事务相关链路日志,包括事务开启日志、事务结束日志,事务所在接口日志、事务执行耗时日志、数据库详情和数量的链路日志、事务提交日志和事务回滚日志,无法对处理时间长的事务进行优化,无法按接口id显示耗时长的事务,无法检测长时间未关闭事务;在事务出现错误时也无法根据事务链路日志来排查事务相关错误信息,包括事务未关闭导致的数据库资源占用增加、数据不一致、事务锁定、系统性能下降,以及事务回滚中出现的错误问题,从而严重影响医院信息系统的稳定性与可靠性。
技术实现思路
1、本发明针对上述现有技术中一个或多个技术缺陷,提出了如下技术方案。
2、基于本发明的第一方面,提出了一种基于druid的事务链路日志记录方法,
3、包括:
4、s1:在druid数据库连接池中实现handlerinterceptor接口,所述handlerinterceptor接口拦截客户端发送的请求,并将所述请求发送到所述druid数据库连接池的业务模块接口;
5、s2:扩展druid数据库连接池中的基础事件监听器类filtereventadapter并监听所述druid数据库连接池中的事件,以及对事务进行监控;
6、s3:在扩展的所述基础事件监听器类filtereventadapter中对所述druid数据库连接池中的方法进行重写;
7、s4:设置yml配置文件的参数并在配置类中装载开启和关闭事务链路日志的配置功能,通过所述yml配置文件控制并记录事务链路日志。
8、更进一步地,s1中所述业务模块接口在处理客户端请求之前,调用所述handlerinterceptor接口的prehandle()方法获取链路跟踪的唯一标识符traceid和接口url并设置到缓存中,以及获取当前链路跟踪的span节点并设置相关的标签tag1;
9、所述标签tag1包括请求参数、请求头和请求客户端ip。
10、通过handlerinterceptor提供的请求拦截和处理机制,可以更加精细地控制请求的处理。
11、更进一步地,所述业务模块接口在处理客户端请求后,调用所述handlerinterceptor接口的aftercompletion()方法获取当前链路跟踪的span节点,并设置相关的标签tag2,记录链路日志;
12、所述标签tag2包括接口响应内容长度和接口响应状态码。
13、更进一步地,s2还包括在扩展的基础事件监听器类filtereventadapter类中定义成员属性,所述成员属性包括事务标识tran_id、事务状态、事务开启时间tx_begin_time和事务过程中执行的数据库语句tx_sql_list。
14、更进一步地,所述druid数据库连接池中的方法包括setautocommit方法,具体地,获取当前事务的事务标识tran_id,若能获取到所述事务标识tran_id则当前事务存在子事务,创建所述子事务的span节点并设置该span节点的事务开始时间和事务相关信息;
15、若无法获取到所述事务标识tran_id则当前事务为主事务,开始对当前事务进行监控。
16、更进一步地,所述对当前事务进行监控具体包括:
17、s401:获取当前系统时间作为主事务的事务开启时间,并存储到事务开启时间tx_begin_time数组中;
18、s402:创建记录数据库语句sql的数组变量对象linkedlist<string>并存储到数据库语句tx_sql_list数组中;
19、s403:创建事务开始的链路日志,获取当前连接的数据库id作为该链路日志的链路标识tranid并保存到事务标识tran_id数组中,生成主事务的span节点并设置该span节点的事务开启时间和事务相关信息。
20、更进一步地,所述druid数据库连接池中的方法还包括statementexecutebefore方法、statementexecuteupdatebefore方法和statementexecutequerybefore方法,分别监控数据库语句、数据库更新语句和数据库查询语句,若statementexecutebefore方法、statementexecuteupdatebefore方法和statementexecutequerybefore方法对应的事务开启时间tx_begin_time数组中分别存在值,则各自记录相关数据库语句存储到相关的数据库语句tx_sql_list数组中。
21、更进一步地,所述druid数据库连接池中的方法还包括重写connection_commit方法,具体地,
22、从缓存中获取url接口,以及获取当前事务的事务标识tran_id,若能获取到当前事务的事务标识tran_id则当前事务为子事务,生成并记录子事务结束的span节点,将当前系统的时间作为事务结束时间,结束statementexecutequerybefore方法;
23、若获取不到当前事务的事务标识tran_id并且所述事务开启时间tx_begin_time数组中存在值,则根据事务开启时间与当前时间计算得到事务执行时间;
24、创建事务结束的链路日志,从事务标识tran_id数组中获取所述链路标识tranid,生成主事务的span节点并设置相关标签tag3,包括事务执行时间、事务开启时间、事务结束时间、业务模块接口、数据库语句tx_sql_list数组中的sql语句和sql语句条数,以及事务状态;
25、清空事务标识tran_id数组、事务开启时间tx_begin_time数组、数据库语句tx_sql_list数组和缓存中的url接口。
26、更进一步地,所述druid数据库连接池中的方法还包括重写connection_rollback方法,具体依照重写所述connection_commit方法进行重写,记录回滚链路日志。
27、基于本发明的第二方面,还提出了一种基于druid的事务链路日志记录系统,包括:
28、接口模块:在druid数据库连接池中实现handlerinterceptor接口,所述handlerinterceptor接口拦截客户端发送的请求,并将所述请求发送到所述druid数据库连接池的业务模块接口;
29、扩展类模块:扩展druid数据库连接池中的基础事件监听器类filtereventadapter并监听所述druid数据库连接池中的事件,以及对事务进行监控;
30、重写模块:在扩展的所述基础事件监听器类filtereventadapter中对所述druid数据库连接池中的方法进行重写;
31、配置模块:设置yml配置文件的参数并在配置类中装载开启和关闭事务链路日志的配置功能,通过所述yml配置文件控制并记录事务链路日志。
32、本发明的技术效果在于:本发明基于druid数据库的拦截器和事件监听机制,自定义记录逻辑,打通链路追踪节点,进行统一的信息展示,解决了现有技术中仅记录不同的业务模块接口相互调用的链路日志,无法记录事务相关链路日志的问题,将事务日志记录和链路日志追踪进行捆绑,能够记录事务开始时间、结束时间日志、事务执行耗时日志、数据库详情和数量的链路日志、事务提交或回滚状态链路日志,并且能够按接口id显示耗时长的事务,以及检测长时间未关闭事务,使数据库具有更好的性能和数据复制功能,以及更强的故障保护功能。
1.一种基于druid的事务链路日志记录方法,其特征在于,包括:
2.根据权利要求1所述的方法,其特征在于,s1中所述业务模块接口在处理客户端请求之前,调用所述handlerinterceptor接口的prehandle()方法获取链路跟踪的唯一标识符traceid和接口url并设置到缓存中,以及获取当前链路跟踪的span节点并设置相关的标签tag1;
3.根据权利要求1所述的方法,其特征在于,所述业务模块接口在处理客户端请求后,调用所述handlerinterceptor接口的aftercompletion()方法获取当前链路跟踪的span节点,并设置相关的标签tag2,记录链路日志;
4.根据权利要求1所述的方法,其特征在于,s2还包括在扩展的基础事件监听器类filtereventadapter类中定义成员属性,所述成员属性包括事务标识tran_id、事务状态、事务开启时间tx_begin_time和事务过程中执行的数据库语句tx_sql_list。
5.根据权利要求1所述的方法,其特征在于,所述druid数据库连接池中的方法包括setautocommit方法,具体地,获取当前事务的事务标识tran_id,若能获取到所述事务标识tran_id则当前事务存在子事务,创建所述子事务的span节点并设置该span节点的事务开始时间和事务相关信息;
6.根据权利要求5所述的方法,其特征在于,所述对当前事务进行监控具体包括:
7.根据权利要求1所述的方法,其特征在于,所述druid数据库连接池中的方法还包括statementexecutebefore方法、statementexecuteupdatebefore方法和statementexecutequerybefore方法,分别监控数据库语句、数据库更新语句和数据库查询语句,若statementexecutebefore方法、statementexecuteupdatebefore方法和statementexecutequerybefore方法对应的事务开启时间tx_begin_time数组中分别存在值,则各自记录相关数据库语句存储到相关的数据库语句tx_sql_list数组中。
8.根据权利要求6所述的方法,其特征在于,所述druid数据库连接池中的方法还包括重写connection_commit方法,具体地,
9.根据权利要求8所述的方法,其特征在于,所述druid数据库连接池中的方法还包括重写connection_rollback方法,具体依照重写所述connection_commit方法进行重写,记录回滚链路日志。
10.一种基于druid的事务链路日志记录系统,其特征在于,包括:
