创建jdbc连接的动态代理,以便覆盖提交或回滚方法



我正在开发一个现有的应用程序,该应用程序大量使用旧式jdbc SQL操作,即SELECT, UPDATE, INSERT等。

应用程序有一个管理数据字段的类,带有一个dirty标志来指示某些内容已经更改并且需要提交给数据库。

当INSERT或UPDATE语句毫无例外地完成并且提交成功时,需要关闭"脏标志"。

由于当前的设计和程序流程的原因,这不是完全微不足道的,所以,我认为可以实现一个用于将更改写入数据库的连接的代理,覆盖提交方法并确保当提交成功时,该标志被设置为关闭。

换句话说,我实际上想实现一个基于java的数据库提交"回调",这样我就可以订阅特定连接的提交,并对这些事件采取行动。

我正在研究byte-buddy作为实现这一目标的可能方法,但是在我目前看到的所有示例中,都可以控制被修改的类的实例化。

那不是我的情况。jdbc驱动程序正在创建实现java.sql.Connection的类型实例,通常由数据库连接池(如TomCat连接池)中使用的另一个类包装。

我如何拦截这些对象的实例化,并动态地覆盖提交和回滚方法?

我可以用字节伙伴吗?

有更好的选择吗?

正如我所读的,我认为您对所有CRUD操作都有单独的方法。因此,我认为你不应该使逻辑复杂化。一个更简单的方法:

  1. 从try块中顺序调用所有必需的方法
  2. 中的catch块(catch (Exception))调用回滚
  3. 在Finally块中,调用commit。

这将简化逻辑,使其更具可读性,并使代码模块化。

你看过Byte Buddy的AgentBuilder吗?我觉得这能帮到你。使用此构建器和Java代理,您可以使用与示例中看到的相同语法,根据类的定义更改类的实现。

最新更新