zoukankan      html  css  js  c++  java
  • 关于数据库连接池使用代理报 java.lang.ClassCastException

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

     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 {
                        }
    
                    });

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

  • 相关阅读:
    QR 编码原理(二)
    QR二维码原理(一)
    UML类图表达
    位运算以及逻辑运算
    SLAM数据集整理
    graph slam BACK END 相关技术资料收集
    Topic与Queue
    集群、分布式与微服务
    spring手动配置
    spring项目gitignore
  • 原文地址:https://www.cnblogs.com/mydomainlistentome/p/4857505.html
Copyright © 2011-2022 走看看