1

我正在开发一个广泛使用旧式 jdbc SQL 操作(即 SELECT、UPDATE、INSERT 等)的现有应用程序。

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

当 INSERT 或 UPDATE 语句无异常完成并且提交成功时,需要关闭“脏标志”。

由于当前的设计和程序流程的原因,这并不是完全无关紧要的,所以,我认为可以实现一个用于将更改写入数据库的 Connection 的代理,覆盖 commit 方法并确保当 commit成功,标志设置为关闭。

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

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

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

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

我可以用字节伙伴来做吗?

有更好的选择吗?

4

2 回答 2

0

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

  1. 从 try 块中依次调用所有必需的方法
  2. 在 catch 块中 (catch (Exception)) 调用回滚
  3. 在 finally 块中,调用提交。

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

于 2015-09-02T07:21:31.803 回答
0

你看过Byte BuddyAgentBuilder吗?我认为这对你有帮助。使用此构建器和 Java 代理,您可以使用您在示例中看到的相同语法根据其定义更改类的实现。只是你改变(变基)一个特定的类。

于 2015-09-02T23:54:46.283 回答