2009-09-25 55 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試了一下。值已設置,甚至已經過驗證,但從未使用過。我懷疑它仍然是這樣。