我使用sun.jdbc.odbc.JdbcOdbcDriver连接到oracle数据库。我知道我可能最好使用瘦驱动程序,但我希望应用程序能够工作而不指定数据库服务器名称和端口号。我连接字符串类似于jdbc:odbc:DSN。
我在我的应用程序中执行的查询可能返回毫安行。所有数据都很重要,所以我不能在查询中限制它们。我担心的是我的java应用程序遇到内存问题。
当我检查语句的获取大小时,它被设置为1.这似乎非常次优(查询检索45K行花费了13分钟)给我,我希望获取至少500的获取大小为了提高绩效。
我的理解是,当我的查询被执行时(我正在使用Statement),语句对象指向数据库上的结果,我使用ResultSet进行迭代。每次执行resultSet.next()时,resultSet都会命中数据库以获取n个行(其中n是获取大小)。这种解释是否正确?如果是这样意味着我的应用程序从不面临任何内存不足问题,直到我的获取大小太大以致JVM被淹没?
当我在创建语句后执行stmt.setFetchSize()时,我得到一个无效的提取大小sql异常。如果我将stmt.setMaxRows()设置为大于提取大小的值,则可以避免此异常。但
1.我不希望我的结果仅限于MaxRows值
2.尝试将最大行设置为一个巨大的值,并尝试获取大小为500,但没有看到时间的改善。
请帮我弄清楚如何设置有效的获取大小并获得一些改进。对于同一个驱动程序的任何其他优化建议将不胜感激。
谢谢,
跌
答案 0 :(得分:2)
我在很多年没有使用JDBC-ODBC桥,但我希望ODBC驱动程序的提取大小可以控制。您使用什么ODBC驱动程序以及您使用的ODBC驱动程序版本是什么? DSN中指定的提取大小是什么?
作为一个单独的问题,我会严肃地质疑你在这个时代使用JDBC-ODBC桥的决定。 JDBC驱动程序可以使用TNS别名,而不是显式指定比ODBC DSN更难配置的主机和端口。并且摆脱了安装,配置和维护ODBC驱动程序和DSN的要求,极大地提高了性能和可维护性。
答案 1 :(得分:1)
使用JDBC。使用ODBC桥没有任何优势。在PreparedStatement或CallableStatement中,您可以调用setFetchSize()来限制行集大小。
答案 2 :(得分:1)
你确定获取大小在Sun的ODBC-JDBC驱动程序中有什么不同吗?我们几年前用Java 5尝试过它。该值已设置,甚至已经过验证但从未使用过。我怀疑它仍然如此。