码迷,mamicode.com
首页 > 数据库 > 详细

关于利用动态代理手写数据库连接池的异常 java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection

时间:2016-04-09 18:43:23      阅读:797      评论:0      收藏:0      [点我收藏+]

标签:

代码如下

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 },这样无论数据库驱动是什么版本的驱动,都能保证这个类型转换不出错。

参考文章:点我呀

使劲点我呀

关于利用动态代理手写数据库连接池的异常 java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection

标签:

原文地址:http://www.cnblogs.com/xiaoduc-org/p/5372019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!