【发布时间】:2019-06-30 09:20:37
【问题描述】:
在浏览Java JDBC ResultSet Types时,有两种滚动类型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 驱动程序支持 INSENSITIVE ResultSet 对象并且不敏感。是这样吗?如果是,为什么以及哪个驱动程序支持两者?如果没有,那么我哪里出错了。
我查看了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} -> 是的
{TYPE_SCROLL_SENSITIVE, CONCUR_UPDATABLE} -> 是的
{TYPE_SCROLL_SENSITIVE, CONCUR_READ_ONLY} -> 是的
【问题讨论】:
-
您是否验证过它是否真的被创建为敏感信息?如有必要,驱动程序可以降级(并且更可能不支持 TYPE_SCROLL_SENSITIVE 与 CONCUR_UPDATABLE 的组合)。也可以尝试禁用自动提交(默认启用自动提交)。
-
@MarkRotteveel 我用不同的组合进行了验证,例如 (TYPE_SCROLL_SENSITIVE, CONCUR_READ_ONLY) 但没有运气。还尝试了自动提交错误。你能解释一下'司机可以在必要时降级'是什么意思吗?
-
我的意思是通过使用
ResultSet.getType()检查实际运行时敏感度来进行验证。如果 JDBC 驱动程序不能满足请求的并发和/或类型,则允许降级并发或类型。 -
还要确保检查相关的
DatabaseMetaData方法以获得实际提供的灵敏度保证。 -
@MarkRotteveel 我通过 DatabaseMetaData 检查了支持并编辑了我的帖子。您可以检查结果是否为真。任何进一步的建议。
标签: java sql oracle jdbc resultset