$Proxy4 cannot be cast to java.sql.Connection

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


原代码出错位置;


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


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



原文链接: $Proxy4 cannot be cast to java.sql.Connection 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙团 ( https://gyarmy.com/post-75.html )

发表评论

0则评论给“$Proxy4 cannot be cast to java.sql.Connection”