如何在Java连接上执行自动提交时收到通知?

时间:2017-07-18 08:36:52

标签: java sql jdbc database-connection

我正在试图弄清楚是否有办法注册自动提交事件。

有观察员吗?也许我装饰一个自动提交连接或语句,以便得到通知?装饰的方法是什么?

我试着听Connection.commit(),但是没有在语句执行时调用它。

感谢。阿利克。

2 个答案:

答案 0 :(得分:2)

自动提交意味着在每个语句执行结束时都有隐含提交。据我所知,没有事件你可以听,你不能指望任何人在内部调用Connection.commit(),因为自动提交发生在你正在使用的RDBMS堆栈中的某个地方,甚至可能在服务器。

因此,为了向JDBC添加自动提交事件,您必须修饰可能导致执行语句的每个函数,并查看执行的SQL是否以UPDATE开始,{{ 1}}或INSERT动词。 (基本上,除DELETE以外的任何东西。)

我过去装饰JDBC的方式如下:

  1. 制作每个JDBC接口的副本,从中创建一个类,为每个委托给JDBC接口的引用的方法创建一个具体的函数。使用大量的搜索和替换,或者可能使用支持录制和重放宏的编辑器。

  2. 定义您自己的驱动程序,并使用您自己的驱动程序名称将其注册到JDBC,例如" jdbcdeco"。

  3. 建立以下约定:驱动程序的连接字符串将为SELECT,后跟要装饰的驱动程序的连接字符串。因此,如果要装饰的连接的连接字符串为"jdbcdeco:",则必须指定以下连接字符串:"jdbc:mysql://localhost/test"

  4. JDBC将实例化您的驱动程序,它将向它传递连接字符串,该字符串以"jdbc:jdbcdeco:mysql://localhost/test"开头。您将剥离"jdbcdeco:"部分,并留下另一个连接字符串,用于再次传递给JDBC以创建将要装饰的实际连接。

  5. 祝你好运,玩得开心!

答案 1 :(得分:0)

简短回答 - 没有这样的方式来注册听取自动提交。正如Mike在回答中所提到的,如果你想捕获编写自定义代码所需的每个提交,你必须打电话,无论你是否想要付出那么多努力。

更简单的解决方法是在您的连接上将setAutoCommit设置为off,但这不是您要求的:)。