流沙团
$Proxy4 cannot be cast to java.sql.Connection
2016-7-23 流沙团


用动态代理调用连接池出现问题, 不太懂得原理, 只找到了解决方法:







原代码出错位置;







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 了,呵呵:







说真的,看不懂, 现在还属于一个会使用的人,原理方面,不太懂!!









发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容