【问题标题】:Trying to understanding the functionality of createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);试图理解 createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 的功能;
【发布时间】:2014-06-01 20:40:08
【问题描述】:

我写了一个小程序来实际了解上述功能的功能。 函数描述如下,创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。为了测试这一点,我编写了一个小程序,它显示数据库中表的内容。然后我反复显示它,经过一段时间的延迟。同时我修改/或更改数据库中的内容。我实际上希望它会显示在输出屏幕上。但没有发生这样的事情。

有人可以给我一个提示吗?下面是截取的代码和输出..

String sql= "select * from customer";
  st=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

    rs=st.executeQuery(sql);

    for(int j=1;j<21;j++){
        System.out.println("Count is "+j);

    while(rs.next()){
        System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5));
        for(int i=0;i<1000000000l;i++);
    }

    while(rs.previous()){
        System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t"+rs.getInt(5));
        for(int i=0;i<1000000000l;i++);
    }

    }

输出

计数为 1

101 cust1 cust1@gmail.com 1111 1000

102 cust2 cust2@gmail.com 2222 2000

103 cust3 cust3@gmail.com 3333 3000

104 cust4 cust4@gmail.com 4444 4000

105 cust5 cust5@gmail.com 5555 5000

106 cust6 cust6@gmail.com 6666 6000

107 cust7 cust7@gmail.com 7777 7000

108 cust8 cust8@gmail.com 8888 8000

109 cust9 cust9@gmail.com 9999 9000

110 cust10 cust10@gmail.com 1010 10000

111 cust11 cust11@gmail.com 1011 11000

111 cust11 cust11@gmail.com 1011 11000

110 cust10 cust10@gmail.com 1010 10000

109 cust9 cust9@gmail.com 9999 9000

108 cust8 cust8@gmail.com 8888 8000

107 cust7 cust7@gmail.com 7777 7000

106 cust6 cust6@gmail.com 6666 6000

105 cust5 cust5@gmail.com 5555 5000

104 cust4 cust4@gmail.com 4444 4000

103 cust3 cust3@gmail.com 3333 3000

102 cust2 cust2@gmail.com 2222 2000

101 cust1 cust1@gmail.com 1111 1000

计数为 2

101 cust1 cust1@gmail.com 1111 1000

102 cust2 cust2@gmail.com 2222 2000

103 cust3 cust3@gmail.com 3333 3000

104 cust4 cust4@gmail.com 4444 4000

105 cust5 cust5@gmail.com 5555 5000

106 cust6 cust6@gmail.com 6666 6000

107 cust7 cust7@gmail.com 7777 7000

108 cust8 cust8@gmail.com 8888 8000

109 cust9 cust9@gmail.com 9999 9000

110 cust10 cust10@gmail.com 1010 10000

111 cust11 cust11@gmail.com 1011 11000

111 cust11 cust11@gmail.com 1011 11000

110 cust10 cust10@gmail.com 1010 10000

109 cust9 cust9@gmail.com 9999 9000

108 cust8 cust8@gmail.com 8888 8000

107 cust7 cust7@gmail.com 7777 7000

106 cust6 cust6@gmail.com 6666 6000

105 cust5 cust5@gmail.com 5555 5000

104 cust4 cust4@gmail.com 4444 4000

103 cust3 cust3@gmail.com 3333 3000

102 cust2 cust2@gmail.com 2222 2000

101 cust1 cust1@gmail.com 1111 1000

注意:我在完成打印第一组值之前更改了数据库内容,即 (count->1)

【问题讨论】:

    标签: java sql jdbc


    【解决方案1】:

    也许关键在于ResultSet.TYPE_SCROLL_SENSITIVE的JavaDoc:

    “[...] 一个可滚动的 ResultSet 对象,通常对 ResultSet 基础数据的更改敏感。”

    也许“一般地”在这里是通常,而不是普遍。在作为 CAN 的意义上,不是必须的。但它很有可能被实施。 (但也许这只是因为我不是以英语为母语的人:-)

    如果您插入/删除记录怎么办?您是否尝试过使用不同的数据库?

    【讨论】:

    • 是的,你说得有道理,反正我会做一些试验然后回复你。我会让你更新给我几天时间。就你的语言而言。它非常清楚。 :)
    • 另一方面,在The Java™ Tutorials, Retrieving and Modifying Values from Result Sets 中:“结果集反映了在结果集保持打开状态时对基础数据源所做的更改。”。修改/更改后是否执行 COMMIT?
    【解决方案2】:

    ResultSet.TYPE_SCROLL_SENSITIVE 字段创建一个ResultSet 对象,其光标可以相对于当前位置和绝对位置向前和向后移动。

    ResultSet.CONCUR_UPDATABLE 字段创建一个可以更新的ResultSet 对象,而CONCUR_READ_ONLY 创建一个不能更新但只能读取的ResultSet

    您看不到您在数据库表中所做的任何更改的问题是因为您使用的是只读类型 ResultSet。

    【讨论】:

    • 谢谢 Muhammad,我明白这一点。但我的问题是,即使我使用的是 ResultSet.CONCUR_UPDATABLE,当值被修改时也没有更新。 Gerold Brose 先生给了我一些建议,我将在以后尝试。如果我发现任何阳性结果,我会及时通知您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2018-12-17
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多