OceanBase LOB 數(shù)據(jù)接口

2021-06-30 15:42 更新

OceanBase Connector/J 提供了用于寫入和讀取整個(gè) LOB 內(nèi)容的簡(jiǎn)化機(jī)制,稱為數(shù)據(jù)接口。

數(shù)據(jù)接口使用標(biāo)準(zhǔn)的 JDBC 方法(如 getString 和 setBytes)讀取和寫入 LOB 數(shù)據(jù)。使用數(shù)據(jù)接口更易于編碼且速度更快, 但與標(biāo)準(zhǔn) java.sql.Blob、java.sql.Clob 和 java.sql.NClob 接口不同,它不提供隨機(jī)訪問(wèn)功能,并且訪問(wèn)數(shù)據(jù)量不能超出 2147483648 個(gè)元素。

Input

OceanBase Connector/J 擴(kuò)展了 PreparedStatement 的 setBytes、setBinaryStream、setStringsetCharacterStream 和 setAsciiStream 方法,以增強(qiáng)使用 BLOB、CLOB 和 NCLOB 的能力。

對(duì)于服務(wù)器端內(nèi)部驅(qū)動(dòng)程序,當(dāng)前對(duì) SQL 語(yǔ)句(如 INSERT 語(yǔ)句)的操作限制為 4000 字節(jié)。此限制不適用于 PL 語(yǔ)句。INSERT 語(yǔ)句通過(guò)包裹在 PL 塊中來(lái)解決這一限制,方法如下:

BEGIN
 INSERT id, name INTO clob_emp VALUES(?,?);
END

對(duì)于大型數(shù)據(jù)共有三種輸入模式,如下所示:

  • 直接綁定

    此綁定方式的大小受到限制,但效率最高。它將所有輸入列的數(shù)據(jù)內(nèi)聯(lián)在的數(shù)據(jù)塊中,再發(fā)送到服務(wù)器。所有數(shù)據(jù)(包括批處理的多次執(zhí)行)都在單個(gè)網(wǎng)絡(luò)操作中發(fā)送。

  • 流綁定

    此綁定將數(shù)據(jù)放在末尾。它將批量大小限制為一個(gè),因而可能需要多次往返才能完成。

  • LOB 綁定

    此綁定創(chuàng)建一個(gè)臨時(shí) LOB,將數(shù)據(jù)復(fù)制到 LOB,并綁定 LOB 定位器。臨時(shí) LOB 在執(zhí)行后自動(dòng)釋放。創(chuàng)建臨時(shí) LOB 然后寫入 LOB 的操作需要多次往返。定位器的輸入可以是成批的。

對(duì)于 SQL 語(yǔ)句,輸入模式的使用注意事項(xiàng)如下:

  • setBytes 和 setBinaryStream 方法對(duì)小于 4001 字節(jié)的數(shù)據(jù)使用直接綁定。

  • setBytes 和 setBinaryStream 方法對(duì)大于 4000 字節(jié)的數(shù)據(jù)使用流綁定。

  • setAsciiStream、setBinaryStream 和 setCharacterStream 方法將長(zhǎng)參數(shù)作為表單長(zhǎng)度,使用長(zhǎng)度大于 2147483648 的 LOB 綁定。未指定長(zhǎng)度的表單始終使用 LOB 綁定。

  • setString、setCharacterStream 和 setAsciiStream 方法對(duì)小于 32767 個(gè)字符的數(shù)據(jù)使用直接綁定。

  • setString、setCharacterStream 和 setAsciiStream 方法對(duì)大于 32766 個(gè)字符的數(shù)據(jù)使用流綁定。

  • setCharacterStream 方法的新形式需要使用 long 參數(shù)的中作為長(zhǎng)度,對(duì)大于 2147483647 的長(zhǎng)度使用 LOB 綁定。未指定長(zhǎng)度的表單始終使用 LOB 綁定。

對(duì)于 PL 語(yǔ)句,輸入模式的使用注意事項(xiàng)如下:

  • setBytes 和 setBinary 流式方法對(duì)小于 32767 字節(jié)的數(shù)據(jù)使用直接綁定。

  • setBytes 和 setBinaryStream 方法對(duì)大于 32766 字節(jié)的數(shù)據(jù)使用 LOB 綁定。

  • setString、setCharacterStream 和 setAsciiStream 方法對(duì)數(shù)據(jù)庫(kù)字符集中小于 32767 字節(jié)的數(shù)據(jù)使用直接綁定。

    說(shuō)明 

    BLOB 無(wú)法使用 setString 來(lái)設(shè)置。

  • setStringsetCharacterStream 和 setAsciiStream 方法對(duì)數(shù)據(jù)庫(kù)字符集中大于 32766 字節(jié)的數(shù)據(jù)使用 LOB 綁定。

自動(dòng)切換輸入模式會(huì)影響某些程序。自動(dòng)切換也可能導(dǎo)致附加的服務(wù)器端解析,以適應(yīng)參數(shù)類型的更改。如果重復(fù)執(zhí)行語(yǔ)句時(shí),數(shù)據(jù)大小在閾值上下不斷變化,則將導(dǎo)致性能影響。切換到流模式也會(huì)影響批處理。

Output

ResultSet 和 CallableStatement 的 getBytesgetBinaryStream、getStringgetCharacterStream 和 getAsciiStream 方法已擴(kuò)展為可與 BLOB、CLOB 或 OUT 參數(shù)一起使用。 這些方法適用于長(zhǎng)度小于 2147483648 的任何 LOB。

說(shuō)明 

getString 和 getNString 方法不能用于檢索 BLOB 列值。

數(shù)據(jù)接口通過(guò)訪問(wèn)驅(qū)動(dòng)程序中的 LOB 定位器進(jìn)行操作,并且對(duì)應(yīng)用程序編程是透明的??梢愿鶕?jù)需要使用 LOB 預(yù)取來(lái)減少或消除的其他數(shù)據(jù)庫(kù)往返行程。

可以使用與 LONG RAW 和 LONG 數(shù)據(jù)相同的流式傳輸機(jī)制來(lái)讀取和寫入 BLOB 或 CLOB 數(shù)據(jù)??梢栽诹猩鲜褂?nbsp;defineColumnType(nn,Types.LONGVARBINARY) 或 defineColumnType(nn,Types.LONGVARCH 方法來(lái)讀取數(shù)據(jù),產(chǎn)生直接流,就好像是讀取 LONG RAW 或 LONG 列的數(shù)據(jù)一樣。

CallableSatement 和 IN OUT 參數(shù)

PL 要求用作 IN OUT 參數(shù)輸入和輸出的 Java 類型必須相同。

對(duì)于存儲(chǔ)過(guò)程的 IN OUT CLOB 參數(shù),希望使用 setString 方法設(shè)置該參數(shù)的值。對(duì)于任何 IN 和 OUT 參數(shù),必須對(duì)相同的類型進(jìn)行綁定。如果無(wú)法確定數(shù)據(jù)大小,則自動(dòng)切換輸入模式會(huì)引發(fā)錯(cuò)誤。例如,如果知道輸入數(shù)據(jù)和輸出數(shù)據(jù)都不會(huì)大于 32766 字節(jié),則可以對(duì)輸入?yún)?shù)使用 setString 方法,并將 OUT 參數(shù)注冊(cè)為 Types.VARCHAR,對(duì)輸出參數(shù)使用 getString 方法。

更好的解決方案是將存儲(chǔ)過(guò)程更改為具有單獨(dú)的 IN 和 OUT 參數(shù)。 如下例所示:

CREATE PROCEDURE clob_obproc( cc IN OUT CLOB );

更改為如下示例:

CREATE PROCEDURE clob_obproc( cc_in IN CLOB, cc_out OUT CLOB );

另一個(gè)解決方法是使用容器塊進(jìn)行調(diào)用。clob_plproc 存儲(chǔ)過(guò)程可以用 Java 字符串包裝,以用于 prepareCall 語(yǔ)句,如下所示:

"DECLARE cc_temp; BEGIN cc_temp := ?; clob_plproc( cc_temp); ? := cc_temp; END;"

無(wú)論哪種情況,都可以在第一個(gè)參數(shù)上使用 setString 方法,在第二個(gè)參數(shù)上使用 registerOutParameter 方法和 Types.CLOB。

大小限制

如果創(chuàng)建非常大的 byte 數(shù)組或 String 可能會(huì)對(duì) Java 內(nèi)存管理系統(tǒng)的性能產(chǎn)生影響。閱讀 Java 虛擬機(jī)(JVM)供應(yīng)商提供的有關(guān)大量數(shù)據(jù)元素影響內(nèi)存管理的相關(guān)信息,并考慮改用流接口。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)