« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
Blog信息 |
blog名称:邢红瑞的blog 日志总数:523 评论数量:1142 留言数量:0 访问次数:9707599 建立时间:2004年12月20日 |

| |
[数据库]M$的JDBC驱动的bug 原创空间, 软件技术
邢红瑞 发表于 2005/8/20 15:20:17 |
在企业应用中,很少有人用微软的jdbc驱动,这个驱动运行一段时间,没有数据请求时,自动把connection关闭,无论在windows还是linux上。
在一次旧的系统改造中,系统报告了[Microsoft][SQLServer JDBC Driver]ResultSet can not re-read row data for column 10的错误。为了解决这个问题,开始跟踪程序,就差没有跟踪M$的JDBC源码了,也没有查出原因。只知道在在rs.getString("bkname")的时候,肯定会出现错误。下面的代码建表CREATE TABLE [book] ( [bkid] int NOT NULL, [bkname] nvarchar(200) COLLATE Chinese_PRC_CI_AS NOT NULL, [bkintroduction] ntext COLLATE Chinese_PRC_CI_AS, [format] nvarchar(10) COLLATE Chinese_PRC_CI_AS, )ON [PRIMARY]sql语句select bkid,bkname,bkintroduction, formatfrom bookjava代码 rs.getString("bkid"); rs.getBinaryStream("bkintroduction"); rs.getString("bkname"); 这个例子,使用微软的驱动,必然会出错。如果你跟踪的话,必然是这一行:rs.getString("bkname")抛出错误。 那么,如果你把rs.getString("bkname")和rs.getBinaryStream("bkintroduction");位置互换以下,就可以正常运行。 出现问题的原因,就是微软的驱动,在包含了blob或clob类型的字段,也就是Image和Text类型。那么就必须按照select顺序查询,且不支持重复查询。 面对这种情况,只有更换驱动了,可以使用jtds,不会存在这种情况。 好像javaunion说过这样的问题,可惜的是,javaunion已经不存在了。 希望大家尽量不要用微软自带的sqlserver的jdbc驱动。解决的办法,如果采用微软提供的ms sql server jdbc driver,如果查询语句中,不存在image或text类型字段,那么可以按照无序获取,如果采用微软提供的ms sql server jdbc driver,如果查询语句中,存在image或text类型字段,那么就必须按照顺序读取,否则就会报告Driver]ResultSet can not re-read row data for column之类的错误,如果无论查询中有没有image或text类型字段,都要不按照顺序获取,或重复获取。那么就必须更换驱动,使用jtds。 |
|
回复:M$的JDBC驱动的bug 原创空间, 软件技术
re(游客)发表评论于2005/11/8 10:06:28 |
|
回复:M$的JDBC驱动的bug 原创空间, 软件技术
喜欢黑夜(游客)发表评论于2005/9/11 4:11:07 |
很早以前我也遇到这样的问题,但是我当时得到的结论是,不管有没有image或text类型字段,都必须安装顺序获取,而且不能重复获取!
etrap@163.com |
|
» 1 »
|