共用方式為


使用適應性緩衝

適應性緩衝是 Microsoft SQL Server 2005 JDBC Driver 1.2 版的新功能,而且這是針對在沒有伺服器資料指標負擔的情況下,擷取任何種類的大數值資料而設計的。

一般而言,當 Microsoft SQL Server 2005 JDBC Driver 執行查詢時,驅動程式會將伺服器中的所有結果擷取到應用程式記憶體中。雖然這個方法會將 SQL Server 的資源消耗降到最低,但是它可以針對產生非常大結果的查詢,在 JDBC 應用程式中擲回 OutOfMemoryError

為允許應用程式處理非常大的結果,Microsoft SQL Server 2005 JDBC Driver 1.2 版提供適應性緩衝功能。應用程式開發人員可能想要搭配陳述式使用適應性緩衝的原因如下:

  • **查詢會產生非常大的結果集:**應用程式可以執行 SELECT 陳述式,該陳述式會產生比應用程式可以儲存在記憶體中還要多的資料列。在舊版中,應用程式必須使用伺服器資料指標來避免 OutOfMemoryError。在 1.2 版中,應用程式可以改用適應性緩衝。適應性緩衝可以針對任意大的結果集進行順向唯讀行程,而不需要伺服器資料指標。

  • 查詢會產生非常大的 SQLServerResultSet 資料行或 SQLServerCallableStatement **OUT 參數值:**應用程式可以擷取值太大而無法完整納入應用程式記憶體的單一值 (資料行或 OUT 參數)。適應性緩衝可讓用戶端應用程式使用 getAsciiStreamgetBinaryStream,getCharacterStream 方法,擷取諸如資料流的值。應用程式會在從資料流讀取時,擷取 SQL Server 中的值。

設定適應性緩衝

應用程式可以要求陳述式執行應該使用適應性緩衝的方式有三種:

使用 get<Type>Stream 方法讀取一次大數值,而且以 SQL Server 傳回的順序存取 ResultSet 資料行和 CallableStatement OUT 參數時,適應性緩衝會將處理結果時的應用程式記憶體使用量降到最低。使用適應性緩衝時:

  • 雖然資料流透過應用程式標示時可以重設,但是在 SQLServerResultSetSQLServerCallableStatement 類別中定義的 get<Type>Stream 方法預設還是會傳回讀取一次的資料流。如果應用程式想要 reset 資料流,必須先在該資料流上呼叫 mark 方法。

  • SQLServerClobSQLServerBlob 類別中定義的 get<Type>Stream 方法會傳回永遠可以重新定位到資料流開始位置的資料流,而不需要呼叫 mark 方法。

當應用程式使用適應性緩衝時,僅可以擷取一次 get<Type>Stream 方法擷取的值。如果您在呼叫相同物件的 get<Type>Stream 方法後,嘗試針對相同的資料行或參數呼叫任何 get<Type> 方法,會擲回例外狀況訊息:「資料已存取,此資料行或參數無法使用」。

將應用程式記憶體使用量降到最低

開發人員應該遵循這些重要的指導方針,將應用程式的記憶體使用量降到最低:

  • 避免使用連接字串屬性 selectMethod=cursor 以便讓應用程式處理非常大的結果集。Microsoft SQL Server 2005 JDBC Driver 1.2 版的適應性緩衝功能可讓應用程式處理非常大的順向唯讀結果集,而不需要使用伺服器資料指標。

  • 使用 getAsciiStreamgetBinaryStream,getCharacterStream 方法,而非 getBlobgetClob 方法,將大型文字或二進位值讀取為資料流。在 1.2 版中,SQLServerCallableStatement 類別針對此用途提供新的 get<Type>Stream 方法。

  • 確保潛在具有大數值的資料行放置在 SELECT 陳述式之資料行清單中的最後面,並確保 SQLServerResultSetget<Type>Stream 方法用於以選取的順序存取資料行。

  • 確保潛在具有大數值的 OUT 參數在用於建立 SQLServerCallableStatement 的 SQL 中的參數清單結尾宣告。此外,確保 SQLServerCallableStatementget<Type>Stream 方法用於以宣告的順序存取 OUT 參數。

  • 避免在相同的連接上,同時執行一個以上的陳述式。在處理前一個陳述式的結果前執行其他陳述式可能會使未處理的結果在應用程式記憶體中緩衝處理。

另請參閱

其他資源

增進 JDBC 驅動程式的效能與可靠性