什么情况下需要将JDBC 的URL 中加入 SelectMethod=Cursor;如下 
jdbc:microsoft:sqlserver://localhost;DatabaseName=test;SelectMethod=Cursor; 
今天看到以前写自己写的一个程序中有这样的设置,可是当时没有及时整理。只记得,当时报了异常:试图打开一个克隆的连接,查了一些资料便做了上面的设置!但具体也没弄太明白,而且由于没有记录这个问题,所以没有从中学到什么!今天恍然看见这段代码便有起了疑问!还请大家多给些经验。谢谢~~~

解决方案 »

  1.   

    SelectMethod=Cursor;
    是打开数据库服务器的结果集游标,在返回结果集很大,需要移动游标的时候
    服务器游标会更有效。有资料显示,PreparedStatement 默认都是服务器游标,只有SQL Server 默认不是。哈哈!另外看你的URL,你用的是JDBC 的老驱动,换最新的吧!
      

  2.   

    http://blogger.org.cn/blog/more.asp?name=hongrui&id=7645
    供你参考最新驱动的下载地址
    http://www.microsoft.com/downloads/details.aspx?FamilyID=E22BC83B-32FF-4474-A44A-22B6AE2C4E17&displaylang=zh-cn
      

  3.   

    LS说的很清楚,不过SelectMethod=Cursor也只是MSSql的参数,所有的数据库都有自己的一套参数。
      

  4.   

    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    conn = DriverManager
    .getConnection(
    "jdbc:microsoft:sqlserver://1.1.1.1:1433;databaseName=11",
    "sa", "1111");我一直都是用这个链接
      

  5.   

    谢 老紫竹和几位朋友了!
    看了老紫竹给的网页!
    其中有这样的记录: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 语句。
    而老紫竹所说的:“打开数据库服务器的结果集游标,在返回结果集很大,需要移动游标的时候,服务器游标会更有效”的说法,并没有体会到!
    能否说的更详细些呢?再谢了~呵呵
      

  6.   

    又明白了一点,呵呵。
    那么到目前的理解,设置 SelectMethod=Cursor 的作用(或目的)有两个:
    1/ 能使一个   JDBC   驱动处理多条   statement   语句。
    2/ 打开游标,从而实现在数据库端读取,并得到想要的数据,以提高效率
    不知道高手能否给予肯定这两点?SelectMethod=Cursor 还有其它的作用吗?问题又来了!如何控制这个在数据库端的游标,使其移动呢?
    刚去网上搜了,没有找到答案。还请赐教。
    分值有点少了,加分了。
      

  7.   

    至少有ResultSet 的
    boolean absolute(int row)http://code.java2000.net/detail.jsp?mid=9702
      

  8.   

    看了几遍这贴子,受益匪浅啊,我也随便问下老紫竹兄.既然selectMethod=cursor有如此多的功能,一般我们都是在建立连接池就做好了这些配置,那为何有时我查询的数据量在2W条左右的时候,系统响应就很慢了呢?
    这个游标到底是如何工作的,我还是不甚明了,请赐教!
      

  9.   

    老紫竹 在8楼所说的 RequestSet 的 absolute() 方法能体现“效率”吗?我有疑问!
    做了个例子: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 后,又怎样去控制游标移动到该位置呢?
      

  10.   

    游标的使用,去看数据库的编程语言吧!
    至于速度,呵呵!2w的结果集可不是个小数目,oracle上没什么,对sql 我就不敢说了!呵呵!