我正在开发一个现有的应用程序,该应用程序大量使用旧式jdbc SQL操作,即SELECT, UPDATE, INSERT等。
应用程序有一个管理数据字段的类,带有一个dirty标志来指示某些内容已经更改并且需要提交给数据库。
当INSERT或UPDATE语句毫无例外地完成并且提交成功时,需要关闭"脏标志"。
由于当前的设计和程序流程的原因,这不是完全微不足道的,所以,我认为可以实现一个用于将更改写入数据库的连接的代理,覆盖提交方法并确保当提交成功时,该标志被设置为关闭。
换句话说,我实际上想实现一个基于java的数据库提交"回调",这样我就可以订阅特定连接的提交,并对这些事件采取行动。我正在研究byte-buddy作为实现这一目标的可能方法,但是在我目前看到的所有示例中,都可以控制被修改的类的实例化。
那不是我的情况。jdbc驱动程序正在创建实现java.sql.Connection的类型实例,通常由数据库连接池(如TomCat连接池)中使用的另一个类包装。
我如何拦截这些对象的实例化,并动态地覆盖提交和回滚方法?
我可以用字节伙伴吗?
有更好的选择吗?
正如我所读的,我认为您对所有CRUD操作都有单独的方法。因此,我认为你不应该使逻辑复杂化。一个更简单的方法:
- 从try块中顺序调用所有必需的方法
- 中的catch块(catch (Exception))调用回滚
- 在Finally块中,调用commit。
这将简化逻辑,使其更具可读性,并使代码模块化。
你看过Byte Buddy的AgentBuilder
吗?我觉得这能帮到你。使用此构建器和Java代理,您可以使用与示例中看到的相同语法,根据类的定义更改类的实现。