2009-09-25 57 views
1

即时通讯使用sun.jdbc.odbc.JdbcOdbcDriver中连接到Oracle database.I知道,我将可能是最好使用薄的驱动程序JDBC ODBC驱动程序获取大小,但我想要的应用,而无需指定工作数据库服务器名称和端口号。我的连接字符串就像jdbc:odbc:DSN。如何设置

,我在我的应用程序执行的查询可能会返回rows.All的millons数据很重要,所以我不能限制他们中的query.My关心的是我的Java应用程序运行到内存的问题。

当我检查它的语句的获取大小时,它被设置为1.这看起来非常不是最优的(一个查询检索45K行花了13分钟),我希望获取大小至少为500以提高性能。

我的理解是执行我的查询时,(我使用的声明)Statement对象指向数据库的结果,我使用迭代一个结果。每次执行resultSet.next()时,resultSet都会触发数据库以获取n个no行(其中n是获取大小)。这个解释是否正确?如果是这样,这意味着我的应用程序将从来没有面对任何内存不足的问题,直到我的抓取大小是如此之大,JVM得到淹没?

当我在创建语句之后执行stmt.setFetchSize()时,我得到一个无效的获取大小sql异常。如果将stmt.setMaxRows()设置为大于获取大小的值,我能够避免此异常。但
1.我不希望我的结果被限制为MaxRows值。
2.尝试将最大行设置为一个巨大的值,并试图获取500的大小,但没有看到时间的改善。

请帮我找出我如何可以设置一个有效的获取大小,并获得相同的驱动程序的一些improvement.Any其他优化建议,将不胜感激。

感谢,
下跌

回答

2

我没有用在好几年了一个JDBC-ODBC桥,但我希望ODBC驱动程序的获取大小将被控制。你使用的是什么ODBC驱动程序,以及你使用的是哪个版本的ODBC驱动程序? DSN中指定的提取大小是什么?

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

+0

非常感谢! 我不知道使用TNS别名的瘦驱动程序。 这解决了我所有的UNIX问题。 有什么办法可以提取在ODBC驱动程序配置中指定的服务器/实例名称? – Fell 2009-09-26 09:43:35

+0

ODBC驱动程序配置存储在Windows的注册表或Unix中的配置文件中。无论哪种情况,都应该可以编写一个能够提取该信息的小应用程序。 – 2009-09-26 19:25:12

+0

再次感谢。我的应用程序现在运行良好! – Fell 2009-09-28 11:29:46

1

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

1

您确定提取大小对Sun的ODBC-JDBC驱动程序有什么影响吗?几年前我们用Java 5试了一下。值已设置,甚至已经过验证,但从未使用过。我怀疑它仍然是这样。