【发布时间】: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