【问题标题】:DatabaseMetaData interface does not work?DatabaseMetaData 接口不起作用?
【发布时间】:2013-05-13 14:57:44
【问题描述】:

我正在尝试this教程中解释的这个接口的方法:

我去:

DatabaseMetaData dm = con.getMetaData();
System.err.println(dm.supportsResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE));

我知道它支持TYPE_SCROLL_SENSITIVE 类型。因为我正在使用它并且它有效。 但是,上面报告的方法返回 false。你有没有尝试过使用这种方法?如果是,它是否正常工作?提前致谢。

PS:其他 2 种类型的 ResultSet(TYPE_SCROLL_INSENSITIVETYPE_FORWARD_ONLY)也是如此。 考虑到TYPE_FORWARD_ONLY 是默认类型,在所有三种情况下我都得到false 有点奇怪。 更新:我正在使用 JDBC-Mysql 驱动程序;

【问题讨论】:

  • 您使用的是哪个 JDBC 驱动程序和 DBMS?并且仅仅因为您可以使用 TYPE_SCROLL_SENSITIVE 请求一个 ResultSet 并不意味着您实际上得到了一个。
  • DatabaseMetaData 是一个接口,提供的实际信息取决于您的驱动程序实现以及它们是否正确实现DatabaseMetaData

标签: java jdbc resultset


【解决方案1】:

MySQL Connector/J 5.1.21 中的实现是:

public boolean supportsResultSetType(int type) throws SQLException {
    return (type == ResultSet.TYPE_SCROLL_INSENSITIVE);
}

不过,快速浏览其余的实现表明 MySQL 也支持其他类型。

【讨论】:

    【解决方案2】:

    假设您指的是 Connector/J 驱动程序(MySQL 的 JDBC 驱动程序不止一个),来自MySQL Connector/J JDBC implementation notes

    • “MySQL 不支持 SQL 游标,并且 JDBC 驱动程序不模拟它们”,并且
    • “默认情况下,ResultSet 被完全检索并存储在内存中。”

    由于TYPE_SCROLL_SENSITIVETYPE_SCROLL_INSENSITIVETYPE_FORWARD_ONLY 通常表示游标类型,因此驱动程序甚至不尝试模拟它们的语句可以解释为什么supportsResultSetType(...) 对所有值都返回 FALSE。使用将整个结果集保存在内存中的默认行为,只进或滚动模式将无关紧要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2013-10-12
      相关资源
      最近更新 更多