【问题标题】:Why generate HikariProxyConnection by javaassist since author already write ProxyConnection?既然作者已经编写了 ProxyConnection,为什么还要通过 javaassist 生成 HikariProxyConnection?
【发布时间】:2018-09-05 09:34:41
【问题描述】:

根据HikariCP的源码,我发现作者是通过javaassist生成HikariProxyConnection,但是类什么都不做,只是调用了超类的方法。

例如,HikariProxyConnection 的超类是 ProxyConnection:

public class HikariProxyConnection extends ProxyConnection implements AutoCloseable, Connection, Wrapper {
   public Statement createStatement() throws SQLException {
     try {
        return super.createStatement();
     } catch (SQLException var2) {
        throw this.checkException(var2);
     }
   }

   public PreparedStatement prepareStatement(String var1) throws SQLException {
     try {
         return super.prepareStatement(var1);
     } catch (SQLException var3) {
         throw this.checkException(var3);
     }
   }    }

我发现ProxyConnection已经做了很多事情了,HikariProxyConnection只是给每个方法添加了一个try catch块。

如果有人能解释一下就好了。

【问题讨论】:

  • 对此我没有权威的答案,但我记得读过 Hikari 使用 javassist 在字节码级别作为性能优化。使用字节码,它们可以使 JVM 静态执行方法调用(尽可能快),而如果它们走装饰器模式路线(即包装类),则 JVM 必须对方法调用进行动态调度(方法重载解析, ...)。
  • 有一个新答案(作者@brettwooldridge):从抽象的ProxyConnection 类生成一个具体的类。任何未被抽象类“覆盖”并且抛出 SQLException 的方法都具有使用以下代码生成的委托: ... 这允许我们检查异常以查看它是否表示断开连接错误。一个副作用是,是的,代码在 JDBC API 更改方面变得灵活——至少到目前为止我们遇到的所有情况都是这样。

标签: java jdbc connection-pooling hikaricp javassist


【解决方案1】:

HikariProxyConnection 的目的有一个 Hikari issue @brettwooldridge 回答:

代理委托给真正的驱动程序类。一些代理,比如 ResultSet 的代理,只拦截一些方法。如果没有代码生成,代理将不得不实现所有 50 多个方法,这些方法只是简单地委托给包装的实例。

基于反射的代码生成也意味着当新的 JDK 版本向现有接口引入新的 JDBC 方法时,无需进行任何操作。

【讨论】:

  • 我已经看过了。但我无法理解这个答案。当 JDK 版本向现有接口引入新的 JDBC 方法时,ProxyConnection 将发生变化。不意味着什么都不需要做
  • 虽然ProxyConnection是一个抽象类,但作为一个连接池,实际上必须实现这个方法。生成这些类只是为了兼容高版本的JDK?
  • @lucare 我建议您对该问题添加评论以获得“官方”回复
猜你喜欢
  • 2015-01-18
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 2016-02-04
  • 2015-02-27
相关资源
最近更新 更多