【发布时间】: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 的提取大小,但所用时间没有任何改善。
请帮助我弄清楚如何设置有效的提取大小并获得一些改进。对于同一驱动程序的任何其他优化建议将不胜感激。
谢谢,
跌倒
【问题讨论】: