用动态代理调用连接池出现问题, 不太懂得原理, 只找到了解决方法:
原代码出错位置;
Connection proxyConn = (Connection) Proxy.newProxyInstance(TestMyData.class.getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals("close")){ //如果进来,说明调用的是close方法, 那么就将 连接 放回到 池子中去 addBack2Pool(conn); return null; } return method.invoke(conn, args); }
代码更改
Connection proxyConn = (Connection) Proxy.newProxyInstance( TestMyData.class.getClassLoader(), new Class[]{Connection.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("close")) { // 如果进来,说明调用的是close方法, 那么就将 连接 放回到 池子中去 addBack2Pool(conn); return null; } return method.invoke(conn, args); } }); return proxyConn;
别人写的原因:
原来Connection.getInterfaces() 与数据库驱动有关,数据库驱动不同 Connection.getInterfaces() 的结果也就不同;Connection.getInterfaces() 返回的是 Class[] 数组,此数组的第一个元素必须是Connection才能把创建的代理类转为Connection对象,否则就会报:java.lang.ClassCastException
说真的,看不懂, 现在还属于一个会使用的人,原理方面,不太懂!!
0则评论给“$Proxy4 cannot be cast to java.sql.Connection”