关于数据库连接池使用代理报 java.lang.ClassCastException

本文探讨了使用动态代理时出现的ClassCastException问题,特别是在不同版本的MySQL连接器中出现的不同行为。文章指出5.0.8版本的mysql-connector-java可以正常工作,而5.1.7及以上版本会导致错误,并提供了修改代码以兼容高版本的具体解决方案。

用到动态代理时会发生这样的错误:

 java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connection

原因是数据库驱动版本的问题;

当用到:

mysql-connector-java-5.0.8-bin.jar

则不会出报错;

但是,当用到:

mysql-connector-java-5.1.7-bin.jar (5.1以上)

则会报 java.lang.ClassCastException: $Proxy0 cannot be cast to java.sql.Connection;

 

Connection proxy = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces()
            , new InvocationHandler(){

                public Object invoke(Object proxy, Method method,
                        Object[] args) throws Throwable {
                }
            
        });

 在两个不同版本  打印出的结果不同

 Class[] interfaces = conn.getClass().getInterfaces();
  System.out.println(interfaces.length);
        for (Class c : interfaces) {
            System.out.println(c.getCanonicalName());
        }

  高版本的通过  conn.getClass().getInterfaces() 获得为 null

 将代码改为:

Connection proxy = (Connection) Proxy.newProxyInstance(conn.getClass()
                .getClassLoader(), new Class[]{Connection.class},
                new InvocationHandler() {

                    public Object invoke(Object proxy, Method method,
                            Object[] args) throws Throwable {
                    }

                });

 这样就可以获得所实现的接口。

转载于:https://www.cnblogs.com/mydomainlistentome/p/4857505.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值