weixin_42224595 2008-07-22 23:11
浏览 255
已采纳

急求 使用代理出现类型转换异常!!!

非常抱歉,由于问题还没有解决而点了关闭问题,在此道歉,用mysql连接没有出现问题,而用sqlserver就出现下述问题。

具体代码如下,异常出现在getConnection方法中Connection conn2 = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterfaces(),this);
异常内容:Exception in thread "main" java.lang.ClassCastException: $Proxy0
at com.think.Handler.bind(Handler.java:24)
at com.think.TestProxy.main(TestProxy.java:9)

代码:
package tutorial.DBUtil;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;

public class _Connection implements InvocationHandler {
private final String CLOSE_METHOD_NAME = "close";
private Connection conn = null;
private boolean inUse = false; //数据库的忙状态

private long lastAccessTime = System.currentTimeMillis();//用户最后一次访问该连接方法的时间

_Connection(Connection conn,boolean inUse)
{
this.conn = conn;
this.inUse = inUse;
}
/**

  • Returns the conn.
  • @return Connection */ public Connection getConnection() { //返回数据库连接conn的接管类,以便截住close方法 Connection conn2 = (Connection)Proxy.newProxyInstance( conn.getClass().getClassLoader(), conn.getClass().getInterfaces(),this); return conn2; }

/**

  • @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object) / public Object invoke(Object proxy,Method m,Object[] args) { Object obj = null; if(CLOSE_METHOD_NAME.equals(m.getName())) { setInUse(false); }else{ try { m.invoke(conn, args); ////设置最后一次访问时间,以便及时清除超时的连接 lastAccessTime = System.currentTimeMillis(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return obj; } /*
  • 该方法真正的关闭了数据库的连接
  • @throws SQLException */ public void close() throws SQLException { //由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接 conn.close(); }

/**

  • Returns the inUse.
  • @return boolean / public boolean isInUse() { return inUse; } /*
  • Returns the lastAccessTime.
  • @return long */ public long getLastAccessTime() { return lastAccessTime; }

/**

  • Sets the inUse.
  • @param inUse The inUse to set */ public void setInUse(boolean inUse) { this.inUse = inUse; }

}

问题补充:
public static void main(String[] args) throws Exception {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url = "jdbc:microsoft:sqlserver://localhost:1433;databasename=Test";
Connection conn = DriverManager.getConnection(url, "sa", "123456");

// Connection con = getConnection();
_Connection _con = new _Connection(conn,true);
Connection cs = _con.getConnection();
PreparedStatement ps = cs.prepareStatement("select * from testuser");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.print(rs.getString(1) + "\n");
System.out.print(rs.getString(2) + "\n");
}

cs.close();
}
其他的除了 obj = m.invoke(conn,args);修改外都一样。既然楼下测试没有问题,我想是否是我的环境中少些东西。当我不用代理时候,一切连接正常。当调用Connection cs = _con.getConnection();就会报异常,Debug 时候在Thread.dispatchUncaughtExcetpion(Throwable) line:not available 页中显示Source not found.

问题补充:
根据楼下的要求 我贴出了main方法,问题还是存在
[b]问题补充:[/b]
针对你提的两个可能,我晚上回去测试下,希望在此期间你能给出更多可能,谢谢
[b]问题补充:[/b]
导入的 java.sql.Connection是JDBC3.0的。就会出现ClassCastException,而且不会打印出更详细的错误信息。
SqlServer2005支持JDBC3.0,那你的意思是只能用2005的版本?

[b]问题补充:[/b]
找了下,好象没有提供的啊,能否给提供下?再次谢谢你的关注!
[b]问题补充:[/b]
象这样说 我只能用sqlserver2005的版本了?
[b]问题补充:[/b]
不错啊 我晚上找个2005的驱动包 调试下,要是行的通的话就结帖,非常感激你的帮助!

  • 写回答

7条回答 默认 最新

  • lggegegmail 2008-07-23 09:26
    关注

    我觉得问题还是在这里:

    [code="java"]Connection conn2 = (Connection)Proxy.newProxyInstance(
    conn.getClass().getClassLoader(),
    conn.getClass().getInterfaces(), // 这个是这个类实现的所有接口
    this);
    return conn2;
    } [/code]

    [code="java"]
    public classs com.microsoft.sqlserver.jdbc.SQLServerConnection implements java.sql.Connection, java.io.Serializable

    public calss com.mysql.jdbc.Connection extends com.mysql.jdbc.ConnectionProperties implements java.sql.Connection [/code]

    他们的区别在于SQLServerConnection多实现了一个接口, 所以, 使用Mysql驱动没问题, 使用SQL驱动有问题, 看分析, 你应该只需要代理Connection.class就好了

    [code="java"]Connection conn2 = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), new Class[] { Connection.class }, this);[/code]

    你再试试看.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!