0 0

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

非常抱歉,由于问题还没有解决而点了关闭问题,在此道歉,用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方法,问题还是存在
问题补充:
针对你提的两个可能,我晚上回去测试下,希望在此期间你能给出更多可能,谢谢
问题补充:
导入的 java.sql.Connection是JDBC3.0的。就会出现ClassCastException,而且不会打印出更详细的错误信息。
SqlServer2005支持JDBC3.0,那你的意思是只能用2005的版本?

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

7个答案 按时间排序 按投票排序

0 0

采纳的答案

我觉得问题还是在这里:

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



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 


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

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


你再试试看.

2008年7月23日 09:26
0 0

我用Oracle10g的JDBC驱动来访问Oracle9i的数据库,没啥问题,还解决了一个BUG(Oracle9i的某个版本的驱动对SQL分页程序支持有个BUG)。

2008年7月23日 15:54
0 0

sqlserver 可以用2000的,JDBC用2005版本的。应该可以行得通。

2008年7月23日 15:51
0 0

引用
SqlServer2005支持JDBC3.0

那么就使用2005的JDBC驱动嘛。

2008年7月23日 14:54
0 0

java.sql.Connection 3.0多了几个方法,而你的sql驱动只实现了2.0的。那就会少几个方法的。这也是导致出错的原因所在。

2008年7月23日 12:29
0 0

接口是3.0的那当然要用支持3.0的版本啦。

2008年7月23日 12:25
0 0

更可能的原因是sqlserver的驱动版本不够高,比如说不支持JDBC3.0,你import语句:

import java.sql.Connection; 


导入的 java.sql.Connection是JDBC3.0的。就会出现ClassCastException,而且不会打印出更详细的错误信息。

2008年7月23日 11:13

相关推荐

    急求学生会监察部工作计划!.doc

    急求学生会监察部工作计划!.doc

    All of Statistics

    - **类型**: - **离散型随机变量**:取值为可列集。 - **连续型随机变量**:取值为区间内的任意值。 - **分布函数**(Cumulative Distribution Function, CDF):随机变量小于等于某值的概率。 - **概率质量函数*...

    怎么实现像阿里巴巴右边那个效果,急求!谢谢!

    我现在需要一个想阿里巴巴右边那个效果的代码,希望高手给一些指导和资料。谢谢了!效果可访问http://www.alibaba.com

    ASP问题(急求!)

    我做的个网站有个页面在进去的时候鼠标事件有错误,但如果是在第二页,鼠标事件又没有错误,请高手指点

    360断网急求箱

    独立版360断网急求箱,不用安装360安全卫士,可独立运行 断网修复工具

    急求医疗废物管理整改报告.doc

    急求医疗废物管理整改报告.doc

    王同《新品卖翻天》:急求成——这种产品呀,起量太慢!.doc

    王同在《新品卖翻天》中探讨了新产品上市初期面临的挑战和急求成的心态。新产品推广往往需要一定的时间才能逐渐积累销量,形成市场影响力。在这个过程中,保持耐心和持续投入至关重要。 1. 新产品生命周期:新产品...

    用authorware制作电子时钟

    供急求authorware作品的人参考!

    急求一个VB密码输入的验证程序编写代码.txt

    急求一个VB密码输入的验证程序编写代码.txt

    MFC 急求帮助

    MFC封装了许多Windows API,使得开发人员能够更容易地使用面向对象的方式来编写Windows程序。而OpenGL则是一种强大的跨语言、跨平台的图形库,主要用于2D和3D图形渲染。当你在MFC应用中使用OpenGL时,你可以利用MFC...

    Chm帮助制作文件 qchm

    "Chm帮助制作文件 qchm" 提到的是使用名为QCHM的工具来创建CHM文件的过程。 QCHM是一款简单易用的CHM文件制作软件,特别适合程序员用来创建程序的帮助文档。这个工具提供了直观的用户界面和便捷的操作流程,使得非...

    急求IBATIS是什么,它的核心,优点,缺点和用时要注意什么_百度知道.mht

    急求IBATIS是什么,它的核心,优点,缺点和用时要注意什么_百度知道,急求IBATIS是什么,它的核心,优点,缺点和用时要注意什么_百度知道急求IBATIS是什么,它的核心,优点,缺点和用时要注意什么_百度知道

    全国自考《急求护理学》试题及答案.docx

    全国自学考试中的《急求护理学》试题及答案主要涵盖了急救医疗服务体系的相关知识,这是护理学中的重要领域,旨在培养护士在紧急情况下提供有效、及时的护理能力。以下是相关知识点的详细说明: 1. 急救医疗服务...

    360急救工具包

    在扫描过程中,360急救工具包采用先进的反病毒引擎,能够识别并处理各种类型的恶意软件,包括病毒、木马、广告软件、间谍软件等。此外,它还具备实时保护功能,可以在用户浏览网页、下载文件或运行应用程序时实时...

    Directshow视频图像采集

    "急求摄像头采集到的位图图象保存的代码!!! VC-MFC"可能包含将摄像头捕获的图像保存为位图文件的代码示例。MFC(Microsoft Foundation Classes)是微软提供的C++类库,用于简化Windows应用程序开发。 最后,...

    Xeterm桌面版

    Xeterm桌面版是兼容eterm...还有更多行业内部人员急求的新功能,如:工作组管理、多账号同时登录、国内舱位运价显示快速中文转换航班内容报价、实时记录预定编码及状态,一键提取、记事本、先进的四则运算计算器等等。

    急求以自己的角度写一篇院学生会秘书处的工作计划….doc

    在实施过程中,我会密切关注各项工作的进展,灵活调整策略,以应对可能出现的挑战。同时,我将始终保持开放的态度,欢迎所有成员的建议和批评,共同为打造高效、和谐的学生会秘书处努力。 活动筹划书方面,我会根据...

    filemon_driver_test.rar_filemon_拦截码_文件系统过滤驱动

    驱动路径的要求我看文档一般用相对路径简单点,假设我的驱动文件放在当前测试代码项目的上一级目录,那我可以直接#define DRIVER_PATH "..\filem.sys",我的测试代码如下,急求各位大侠帮忙!!

Global site tag (gtag.js) - Google Analytics