[转]M$的JDBC驱动的bug

转至: blogger.org.cn/blog/more.asp

在企业应用中,很少有人用微软的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 book
java代码
 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。

你可能感兴趣的:(sql,linux,jdbc,SQL Server,企业应用)