关于利用动态代理手写数据库连接池的异常 java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection
代码如下:
final Connection conn=pool.remove(0); //利用动态代理改造 close 方法 Connection proxy= (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("close".equals(method.getName())){ //对于想改造的 close 方法,我们自己写 retConn(conn); return null; }else{ //对于不想改造的方法,用被代理者身上相同的方法 return method.invoke(conn, args); } } });
异常如下:
java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection
原因分析:
这个异常出现的原因在于我使用的 mysql 数据库驱动的问题,由于数据库驱动不同,Connection.class.getInterfaces()返回的结果也不同,它返回的是一个 Class[] 数组,然而此数组的第一个元素必须是 Connection 才能把创建的代理类转为 Connection 对象,否则就会报错。
所以这里我们可以采取一个替代方式替换 Connection.class.getInterfaces(),即 new Class[] {Connection.class},这样无论数据库驱动是什么版本的驱动,都能保证这个类型转换不出错。
参考文章:点我呀
__EOF__
本文作者:破玉
本文链接:https://www.cnblogs.com/xiaoduc-org/p/5372019.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/xiaoduc-org/p/5372019.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!