我正在试图弄清楚是否有办法注册自动提交事件。
有观察员吗?也许我装饰一个自动提交连接或语句,以便得到通知?装饰的方法是什么?
我试着听Connection.commit()
,但是没有在语句执行时调用它。
感谢。阿利克。
答案 0 :(得分:2)
自动提交意味着在每个语句执行结束时都有隐含提交。据我所知,没有事件你可以听,你不能指望任何人在内部调用Connection.commit()
,因为自动提交发生在你正在使用的RDBMS堆栈中的某个地方,甚至可能在服务器。
因此,为了向JDBC添加自动提交事件,您必须修饰可能导致执行语句的每个函数,并查看执行的SQL是否以UPDATE
开始,{{ 1}}或INSERT
动词。 (基本上,除DELETE
以外的任何东西。)
我过去装饰JDBC的方式如下:
制作每个JDBC接口的副本,从中创建一个类,为每个委托给JDBC接口的引用的方法创建一个具体的函数。使用大量的搜索和替换,或者可能使用支持录制和重放宏的编辑器。
定义您自己的驱动程序,并使用您自己的驱动程序名称将其注册到JDBC,例如" jdbcdeco"。
建立以下约定:驱动程序的连接字符串将为SELECT
,后跟要装饰的驱动程序的连接字符串。因此,如果要装饰的连接的连接字符串为"jdbcdeco:"
,则必须指定以下连接字符串:"jdbc:mysql://localhost/test"
JDBC将实例化您的驱动程序,它将向它传递连接字符串,该字符串以"jdbc:jdbcdeco:mysql://localhost/test"
开头。您将剥离"jdbcdeco:"
部分,并留下另一个连接字符串,用于再次传递给JDBC以创建将要装饰的实际连接。
答案 1 :(得分:0)
简短回答 - 没有这样的方式来注册听取自动提交。正如Mike在回答中所提到的,如果你想捕获编写自定义代码所需的每个提交,你必须打电话,无论你是否想要付出那么多努力。
更简单的解决方法是在您的连接上将setAutoCommit设置为off,但这不是您要求的:)。