我想弄清楚是否有办法注册到自动提交事件。如何在Java连接上执行自动提交时得到通知?
是否有观察者?也许我装饰一个自动提交连接或声明以通知?什么是装饰方法?
我试着聆听Connection.commit()
,但它没有在语句执行时被调用。
谢谢。阿利克。
我想弄清楚是否有办法注册到自动提交事件。如何在Java连接上执行自动提交时得到通知?
是否有观察者?也许我装饰一个自动提交连接或声明以通知?什么是装饰方法?
我试着聆听Connection.commit()
,但它没有在语句执行时被调用。
谢谢。阿利克。
自动提交意味着在每个语句执行结束时存在隐式提交。据我所知,没有任何事件可以听,而且也不能指望任何人在内部调用Connection.commit()
,因为自动提交发生在您正在使用的RDBMS堆栈内的某处,甚至可能在服务器上。
所以,为了一个自动提交事件添加到JDBC你有装饰,可能导致被执行的语句的每一个功能,并看到被执行的SQL是否开始与UPDATE
,INSERT
或DELETE
动词。 (基本上,任何事情,但SELECT
。)
我已经在过去的装饰JDBC的方式如下:
让每一个JDBC接口的副本,创建一个类出来,创建每个方法的具体函数委派给一个JDBC接口的引用。使用大量的搜索和替换或可能是一个支持录制和重播宏的编辑器。
使用自己的驱动程序名称(如“jdbcdeco”)定义自己的驱动程序,并使用JDBC注册它。
建立以下约定:驱动程序的连接字符串将为"jdbcdeco:"
,后跟要装饰的驱动程序的连接字符串。所以,如果你想装饰的连接的连接字符串为"jdbc:mysql://localhost/test"
那么下面的连接字符串必须指定:"jdbc:jdbcdeco:mysql://localhost/test"
JDBC将实例你的驱动程序,它会通过它的连接字符串,它与"jdbcdeco:"
开始。你剥离了"jdbcdeco:"
部分,并且你留下了另一个连接字符串,为了创建将要装饰的实际连接,您使用该连接字符串再次传递给JDBC。
祝你好运,玩得开心!
简短的回答 - 没有这样的方式来注册听到自动提交。正如Mike在答复中所提到的,如果您想捕获每一次需要编写自定义代码的提交,则无论您是否愿意经历那么多努力,您都必须进行调用。
更简单的解决方法是将setAutoCommit设置为关闭连接,但这不是你要求的:)。