gpt4 book ai didi

java - 如何从 prepareCall 方法中获取自定义 CallableStatement 对象

转载 作者:行者123 更新时间:2023-11-29 04:59:02 26 4
gpt4 key购买 nike

我想创建一个扩展 CallableStatement 对象的子类。我想这样做,以便我可以覆盖 execute 和 executeQuery 方法来跟踪每个 SP 调用的一些指标。

目前我有这样的代码:

Connection db = poolingDataSource.getConnection();
CallableStatement cstmt = db.prepareCall("{call pSampleStoredProc()}");
ResultSet rs = cstmt.executeQuery();

其中 poolingDataSource 来自 apache commons dbcp 包。我的实现使用 JDBC 连接到 MySQL 数据库。

目前,prepareCall 方法返回一个 com.mysql.jdbc.JDBC4CallableStatement。我希望能够更改它,以便它返回一个我自己的类,该类扩展了 JDBC4CallableStatement 但覆盖了 execute() 和 executeQuery() 方法。

关于执行此操作的最佳方法有什么想法吗?

最佳答案

如果您需要执行此操作的地方数量可控,我建议使用一种简单的方法(比尝试让数据库驱动程序返回您的自定义 CallableStatement 对象更容易)是制作一个包装器或装饰器包装您从 db 获得的 CallableStatement 对象。基本上创建一个实现 CallableStatement 的所有方法的类,将 CallableStatement 对象作为其构造函数的参数,并将所有方法调用委托(delegate)给另一个对象,除了 execute() 和 executeQuery() 你还在委托(delegate)给其他对象 execute() 方法之前和之后调用您的日志记录方法。

当然还有其他方法可以做到这一点,这让我觉得更容易。

Connection db = poolingDataSource.getConnection();
CallableStatement cstmt = db.prepareCall("{call pSampleStoredProc()}");
MyCallableStatement mystmt = new MyCallableStatement( cstmt );
ResultSet rs = mystmt.executeQuery();

关于java - 如何从 prepareCall 方法中获取自定义 CallableStatement 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3621177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com