【问题标题】:how to set fetch size for jdbc odbc driver如何为 jdbc odbc 驱动程序设置提取大小
【发布时间】:2010-12-01 11:31:51
【问题描述】:

我正在使用 sun.jdbc.odbc.JdbcOdbcDriver 连接到 oracle 数据库。我知道使用瘦驱动程序可能会更好,但我希望应用程序在不指定数据库服务器名称和端口号的情况下工作。我的连接字符串类似于 jdbc:odbc:DSN。

我在应用程序中执行的查询可能会返回数百万行。所有数据都很关键,因此我无法将它们限制在查询中。我担心我的 java 应用程序会遇到内存问题。

当我检查语句的提取大小时,它被设置为 1。这对我来说似乎非常次优(检索 45K 行的查询花了大约 13 分钟),我希望提取大小至少为 500,所以以提高性能。

我的理解是,当我的查询被执行时(我正在使用语句),语句对象指向我使用 ResultSet 迭代的数据库上的结果。每次我执行 resultSet.next() 时,resultSet 都会访问数据库以获取 n 行(其中 n 是获取大小)。这种解释正确吗?如果是这样,这是否意味着我的应用程序永远不会遇到任何内存不足问题,直到我的 fetch 大小大到 JVM 被淹没?

当我在创建语句后执行 stmt.setFetchSize() 时,我得到一个无效的 fetch size sql 异常。如果我将 stmt.setMaxRows() 设置为大于 fetch size 的值,我可以避免此异常。但是
1. 我不希望我的结果仅限于 MaxRows 值。
2. 尝试将最大行数设置为一个巨大的值,并尝试使用 500 的提取大小,但所用时间没有任何改善。

请帮助我弄清楚如何设置有效的提取大小并获得一些改进。对于同一驱动程序的任何其他优化建议将不胜感激。

谢谢,
跌倒

【问题讨论】:

    标签: java oracle jdbc


    【解决方案1】:

    我已经有好几年没有使用 JDBC-ODBC 桥了,但我希望 ODBC 驱动程序的获取大小可以控制。您使用的是什么 ODBC 驱动程序以及您使用的是什么版本的 ODBC 驱动程序? DSN 中指定的提取大小是多少?

    作为一个单独的问题,我会严重质疑您在当今时代使用 JDBC-ODBC 桥的决定。 JDBC 驱动程序可以使用 TNS 别名,而不是显式指定主机和端口,这并不比 ODBC DSN 更难配置。摆脱安装、配置和维护 ODBC 驱动程序和 DSN 的要求大大提高了性能和可维护性。

    【讨论】:

    • 非常感谢!我不知道使用 TNS 别名的瘦驱动程序。这解决了我所有的unix问题。有什么方法可以提取 ODBC 驱动程序配置中指定的服务器/实例名称?
    • ODBC 驱动程序配置存储在 Windows 的注册表或 Unix 的配置文件中。无论哪种情况,都应该可以编写一个小应用程序来提取该信息。
    【解决方案2】:

    您确定提取大小对 Sun 的 ODBC-JDBC 驱动程序有任何影响吗?几年前,我们使用 Java 5 进行了尝试。该值已设置,甚至经过验证,但从未使用过。我怀疑情况仍然如此。

    【讨论】:

      【解决方案3】:

      使用 JDBC。使用 ODBC 桥接器没有任何优势。在 PreparedStatement 或 CallableStatement 中,您可以调用 setFetchSize() 来限制行集大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 2020-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多