- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在查看Java JDBC ResultSet类型时,有两种滚动类型TYPE_SCROLL_SENSITIVE和TYPE_SCROLL_INSENSITIVE,这是我所理解的。但是当我去实际执行的时候,并没有看到效果。下面是代码:
package com.jdbc.resultsettypeandconcurrency;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TypeInSensitiveConcurUpdate {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
try {
System.out.println("loading the driver.....");
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("Driver loaded");
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "user", "pass");
if(con!=null) {
System.out.println("Connected to database");
} else {
System.out.println("Could not Get Connection");
}
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";
ResultSet rs = stmt.executeQuery(query);
System.out.println();
int cnt = 1;
while(rs.next()) {
System.out.print(rs.getString("COF_NAME")+", ");
System.out.print(rs.getInt("SUP_ID")+", ");
System.out.print(rs.getFloat("PRICE")+", ");
System.out.print(rs.getInt("SALES")+", ");
System.out.print(rs.getInt("TOTAL")+"\n");
if(cnt == 2){
try {
Thread.sleep(20 * 1000);/**LINE:39*/
} catch (InterruptedException e) {
e.printStackTrace();
}
}
cnt++;
}
System.out.println();
} catch(ClassNotFoundException e) {
System.out.println("ClassNotFoundException : Driver Class not found");
System.out.println(e.getMessage());
} catch(SQLException e) {
System.out.println("SQL Error "+e.getMessage());
System.out.println(e.getErrorCode());
} finally {
if(stmt!=null) {
stmt.close();
}
if(con!=null) {
con.close();
}
System.out.println("All Connection closed");
}
}
}
当程序到达第 39 行时,我从后端更新数据库中的记录。对于 TYPE_SCROLL_INSENSITIVE,它不会显示应执行的更新记录,但对于 TYPE_SCROLL_SENSITIVE,它不会执行所需的行为。它必须显示更新的记录,但不显示。谁能告诉我为什么会这样吗?
我在谷歌搜索(不是Java文档或JLS)时在某处读到ODBC瘦驱动程序,OCI驱动程序支持不敏感的结果集对象并且不敏感。是这样吗?如果是,为什么以及哪个驱动程序支持两者?如果不是,那么我哪里出错了。
我浏览了link ,但没有指出我的问题。任何建议将不胜感激。
编辑:添加这些行来检查支持
DatabaseMetaData meta = con.getMetaData();
System.out.println("{TYPE_SCROLL_INSENSITIVE, CONCUR_UPDATABLE} -> "+
meta.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE));
System.out.println("{TYPE_SCROLL_SENSITIVE, CONCUR_UPDATABLE} -> "+
meta.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE));
System.out.println("{TYPE_SCROLL_SENSITIVE, CONCUR_READ_ONLY} -> "+
meta.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY));
下面是我得到的结果:
{TYPE_SCROLL_INSENSITIVE,CONCUR_UPDATABLE} -> true
{TYPE_SCROLL_SENSITIVE,CONCUR_UPDATABLE} -> true
{TYPE_SCROLL_SENSITIVE,CONCUR_READ_ONLY} -> true
最佳答案
与其他不起作用的功能一样,您必须阅读documentation在使用它们之前。
重要的是窗口的概念
The Oracle implementation of scroll-sensitive result sets involves the concept of a window, with a window size that is based on the fetch size. The window size affects how often rows are updated in the result set.
因此,要观察每一行的变化,必须将获取大小设置为1。
请注意,仅设置 resultSet 的获取大小是不够的,因为默认获取大小为 10,并且更改仅对第 11 行及后续行有效。
因此必须在 prepareStatement
上设置获取大小:
def stmt = con.prepareStatement("""select id, val from test
where id between ? and ? order by id""", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)
stmt.setFetchSize(1)
// set bind variables and execute statement
现在,每次调用 rs.next()
都会打开一个新窗口,这会导致内部调用 refreshRow
从数据库获取当前值。
请注意,此行为仅针对 TYPE_SCROLL_SENSITIVE
执行,对于 TYPE_SCROLL_INSENSITIVE
不会调用 refreshRow
,因此您会看到常量数据从最初的查询开始,即使您切换了窗口。您可以显式调用 refreshRow
来查看相同的效果。
从技术上讲,该功能是使用两个光标来实现的。第一个对应于使用的查询,仅添加 ROWID 列。
select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :1 and :2 order by id
在每个窗口切换时调用第二个游标(即,对于获取的每行,获取大小 = 1),简单外部将保存的 rowid
与第一个游标的查询进行连接,以重新获取当前数据。
WITH "__JDBC_ROWIDS__" AS (SELECT COLUMN_VALUE ID, ROWNUM NUM FROM TABLE(:1 ))
SELECT "__JDBC_ORIGINAL__".*
FROM (select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :2 and :3 order by id) "__JDBC_ORIGINAL__", "__JDBC_ROWIDS__"
WHERE "__JDBC_ORIGINAL__"."__Oracle_JDBC_internal_ROWID__"(+) = "__JDBC_ROWIDS__".ID
ORDER BY "__JDBC_ROWIDS__".NUM
那里有类似的问题,但没有一个真正解释了问题,所以我不会将此问题标记为重复:
Behaviour of ResultSet.TYPE_SCROLL_SENSITIVE
JDBC ResultSet Type_Scroll_Sensitive
JDBC result set type scroll sensitive
简单的回答是,您使用的默认提取大小太高,无法观察单行的更新。
测试完成于Oracle Database 12c 企业版版本 12.2.0.1.0
驱动程序版本12.2.0.1.0
关于java - JDBC类型滚动不敏感和敏感,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54553339/
我一直在使用 Databricks JDBC 驱动程序版本 2.6.22,并尝试升级到 2.6.27。但是,升级后我收到消息说我的 JDBC URL 在尝试连接时无效。这些 JDBC URL 与旧版本
似乎JDBC Spec没有详细说明数据源连接池中alive or idle connections的准确含义。它只是具体实现吗? DBCP2如何或 HikariCP实际检查连接状态? 下面没有事件事务
在“XPages 扩展库”一书中,第 12 章,第 409 页有一个 JDBC 连接文件的例子: org.apache.derby.jdbc.EmbeddedDriver jdbc:
谁能告诉我 jdbc 是如何工作的?它如何设法与 DBMS 通信?因为 DBMS 可能是用其他编程语言编写的。 最佳答案 与数据库的通信由 JDBC 驱动程序处理,这些驱动程序可以使用各种策略与数据库
我想知道是否有人可以帮助我解决这个问题。我在尝试使用 Spring JDBC 编写代码时遇到了一个问题。当我运行服务器时,我收到了标题中提到的消息。我google了一下,有人说你应该导入ojdbc.j
我只是想运行一个示例 hivejdbc 客户端程序,但它给我一个内存不足的错误。 import java.sql.SQLException; import java.sql.Connection; i
我需要将 Google Spreadsheet 与 JasperReports Server 一起使用,为此我需要一个用于 Google Spreadsheet 的 JDBC 连接器。 我找到了这个
我需要将大量行(最多 100,000 行)插入到 6 个不同的 DB2 表中。我正在使用 Java JDBC 来完成它。我想在单个数据库事务中完成所有操作,以便在遇到任何问题时可以回滚整个操作。在某处
再次为自己是 Jmeter 新手道歉——我对 JDBC 请求有点困惑——我在过去的 3 个小时里浏览了这个网站上的帖子——但我找不到任何相关的东西(除非我我错过了一些东西)。 我的环境:Jmeter
我们正在创建一个带有 MySQL 后端的 XPages 应用程序。应用程序将被多个客户使用。每个都有自己的 NSF 数据库和相应的 MySQL 数据库。每个客户都有自己的 MySQL 用户名。我们正在
昨天我遇到了一个大问题。在我当前的项目中,我使用 Oracle 的 JDBC 的 ojdbc6 实现进行连接,但我还需要处理例如 oracle 8 数据库,这对于这个 JAR 是完全不可能的。 你会说
这个问题在这里已经有了答案: Closing JDBC Connections in Pool (3 个答案) 关闭 2 年前。 假设我有以下代码 DataSource source = (Data
我有 Informix 数据库,时间戳字段定义为 YEAR TO SECOND。 当我使用 JDBC rs.getString(column) 显示此字段时,它使用带毫秒的格式,因此此字段如下所示:
看完本教程之后; https://www.youtube.com/watch?v=ZnI_rlrei1s 我正在尝试使用logstash和jdbc获取我的本地主机mysql(使用laravel val
有人给我小费。 { "type": "jdbc", "jdbc": { "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver"
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在尝试从mysql表中将1600万个文档(47gb)索引为elasticsearch索引。我正在使用jparante's elasticsearch jdbc river执行此操作。但是,在创建河
我正在尝试使用JDBC河将我的MySQL数据库复制到我的ElasticSearch索引中。 但是,每当我启动服务器时,与MySQL表的count(*)相比,创建的文档数量就增加了一倍。我通过清空索引并
使用新的logstash jdbc 连接器: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html后续的
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我是一名优秀的程序员,十分优秀!