什么情况下需要将JDBC 的URL 中加入 SelectMethod=Cursor;如下
jdbc:microsoft:sqlserver://localhost;DatabaseName=test;SelectMethod=Cursor;
今天看到以前写自己写的一个程序中有这样的设置,可是当时没有及时整理。只记得,当时报了异常:试图打开一个克隆的连接,查了一些资料便做了上面的设置!但具体也没弄太明白,而且由于没有记录这个问题,所以没有从中学到什么!今天恍然看见这段代码便有起了疑问!还请大家多给些经验。谢谢~~~
jdbc:microsoft:sqlserver://localhost;DatabaseName=test;SelectMethod=Cursor;
今天看到以前写自己写的一个程序中有这样的设置,可是当时没有及时整理。只记得,当时报了异常:试图打开一个克隆的连接,查了一些资料便做了上面的设置!但具体也没弄太明白,而且由于没有记录这个问题,所以没有从中学到什么!今天恍然看见这段代码便有起了疑问!还请大家多给些经验。谢谢~~~
是打开数据库服务器的结果集游标,在返回结果集很大,需要移动游标的时候
服务器游标会更有效。有资料显示,PreparedStatement 默认都是服务器游标,只有SQL Server 默认不是。哈哈!另外看你的URL,你用的是JDBC 的老驱动,换最新的吧!
供你参考最新驱动的下载地址
http://www.microsoft.com/downloads/details.aspx?FamilyID=E22BC83B-32FF-4474-A44A-22B6AE2C4E17&displaylang=zh-cn
conn = DriverManager
.getConnection(
"jdbc:microsoft:sqlserver://1.1.1.1:1433;databaseName=11",
"sa", "1111");我一直都是用这个链接
看了老紫竹给的网页!
其中有这样的记录:java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Can't start manual transaction mode because there are cloned connectionsThis error occurs when you try to execute multiple statements against a SQL Server database with the JDBC driver while in manual transaction mode (AutoCommit=false) and while using the direct (SelectMethod=direct) mode. Direct mode is the default mode for the driver."这段话的意思是: 当使用一个 AutoCommit=false 并且 SelectMethod=direct 的 JDBC 驱动处理多条 statement 语句时发生错误。(翻译的不知道是否准确。)
处理办法就是设置 SelectMethod=Cursor.
通过以上所诉。我到是觉得设置 SelectMethod=Cursor 的作用是为了能使一个 JDBC 驱动处理多条 statement 语句。
而老紫竹所说的:“打开数据库服务器的结果集游标,在返回结果集很大,需要移动游标的时候,服务器游标会更有效”的说法,并没有体会到!
能否说的更详细些呢?再谢了~呵呵
那么到目前的理解,设置 SelectMethod=Cursor 的作用(或目的)有两个:
1/ 能使一个 JDBC 驱动处理多条 statement 语句。
2/ 打开游标,从而实现在数据库端读取,并得到想要的数据,以提高效率
不知道高手能否给予肯定这两点?SelectMethod=Cursor 还有其它的作用吗?问题又来了!如何控制这个在数据库端的游标,使其移动呢?
刚去网上搜了,没有找到答案。还请赐教。
分值有点少了,加分了。
boolean absolute(int row)http://code.java2000.net/detail.jsp?mid=9702
这个游标到底是如何工作的,我还是不甚明了,请赐教!
做了个例子:public static void main(String[] a) {
String sql = "select * from testTable"; try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection(
"jdbc:microsoft:sqlserver://localhost:1433;databaseName=A_Hospital; SelectMethod=Cursor",
"sa", "brisaandmay");
PreparedStatement ps = con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = ps.executeQuery();
rs.absolute(5);
if(rs.previous()){
System.out.println(rs.getInt("testId"));// A处
}else{
System.out.println("Success");
}
rs.close();
ps.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}这个例子打印了 A处的内容。也就是说所以结果都一并返回了!并不是象我想的那样:结果集中只存储第6条以后的内容。所以我也没从中看到效率。
还是不太明白,在数据库端是怎样的一个情况,就象6楼所说,如果我想得到数据库中的第10w条数据,在我设置SelectMethod=Cursor 后,又怎样去控制游标移动到该位置呢?
至于速度,呵呵!2w的结果集可不是个小数目,oracle上没什么,对sql 我就不敢说了!呵呵!