W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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è)元素。
OceanBase Connector/J 擴(kuò)展了 PreparedStatement
的 setBytes
、setBinaryStream
、setString
、setCharacterStream
和 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è)置。
setString
、setCharacterStream
和 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ì)影響批處理。
ResultSet
和 CallableStatement
的 getBytes
、getBinaryStream
、getString
、getCharacterStream
和 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ù)一樣。
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)信息,并考慮改用流接口。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: