OA系统在读写数据库时,会对各表维护缓存,以提高性能。实际业务中,我们经常要在OA系统之外写库,此时OA系统中的表缓存可能是陈旧的,这会导致数据不一致。因此,我们需要清除OA系统中指定表的表缓存的功能。OA系统未提供这种功能,我们要自己想办法开发出来。
原理
通过逆向工程分析OA系统的表缓存机制。
RecordSet的executeQuery()和executeUpdate()最终都是执行executeSql()。在executeSql()中,以"select"开头的SQL会先尝试从缓存获取结果,非"select"开头的SQL不会。在未命中缓存的情况下,SQL执行成功后,会调用CacheFactory的refreshCache()更新缓存。
在CacheFactory的refreshCache()中,如果SQL以"select"开头,则调用putCache()更新指定表的缓存的一部分;如果SQL非"select"开头,则调用removeCacheForSql()清除指定表的所有缓存。
那么,想要清除指定表的缓存,就只需要执行一条非"select"开头的、包含指定表名的SQL语句,比如写库SQL,但更安全的办法是执行desc 表名。
实现
实现APIclearTableCache,接收参数tableNames。遍历表名,对每个表名通过RecordSet的executeQuery()执行SQLdesc 表名。