使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法

43 篇文章 0 订阅
getFreeConnection方法的代码如下:

    public Connection getFreeConnection() {
        //返回数据库连接conn的接管类,以便截住close方法
        Connection conn2 = null;
        if (conn instanceof Connection) {
            conn2 = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), this);
        }
        return conn2;
    }

用MySQLv5版本的数据库驱动没有问题,使用MySQLv6和Oracle的数据库驱动时候报如下错误:
java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connection
        at dbpoolImpl._Connection.getFreeConnection(_Connection.java:126)
        at dbpoolImpl.ConnectionFactory.getFreeConnection(ConnectionFactory.java:113)
        at dbpoolImpl.DataBase_Task.checkDataBase(DataBase_Task.java:83)
        at dbpoolImpl.DataBase_Task.ProcessHandle(DataBase_Task.java:227)

在网上搜索很久,终于找到解决方法,将创建代理类的语句改一下“
conn2 = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), new Class[]{Connection.class}, this);

原因就在于conn.getClass().getInterfaces()方法出来的是Class类数组,此数组的第一个元素必须是Connection才能把创建的代理类转为Connection对象,大家可以使用下面的语句
        Class[] interfaces = conn.getClass().getInterfaces();
        for (Class c : interfaces) {
            System.out.println(c.getCanonicalName());
        }
打印一下使用不同数据库驱动时conn.getClass().getInterfaces()里面都有啥元素
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值