新聞中心
在數(shù)據(jù)庫(kù)管理中,往往需要用到blob字段,該字段可以存儲(chǔ)大量二進(jìn)制數(shù)據(jù),例如圖片、視頻、音頻等等。但是,由于文件大小不斷增長(zhǎng),管理blob字段大小變得愈加困難。不當(dāng)?shù)墓芾矸椒赡軙?huì)導(dǎo)致性能問(wèn)題以及存儲(chǔ)問(wèn)題,所以,在數(shù)據(jù)庫(kù)中管理blob字段大小顯得尤為重要。

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供忻府網(wǎng)站建設(shè)、忻府做網(wǎng)站、忻府網(wǎng)站設(shè)計(jì)、忻府網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、忻府企業(yè)網(wǎng)站模板建站服務(wù),十載忻府做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
在本文中,我們將向您介紹一些在數(shù)據(jù)庫(kù)中管理blob字段大小的技術(shù),讓您的數(shù)據(jù)庫(kù)管理變得更加專業(yè)和高效。
1. 預(yù)估大小
為了避免大規(guī)模的空間浪費(fèi)以及性能問(wèn)題,在使用blob字段之前,我們首先需要掌握我們需要存儲(chǔ)的數(shù)據(jù)量的大小。該方法對(duì)于基礎(chǔ)數(shù)據(jù)類型(例如,int和varchar類型)非常有用,而對(duì)于blob類型也同樣適用。
通過(guò)估算blob字段的大小,我們可以預(yù)測(cè)數(shù)據(jù)庫(kù)的空間需求。在此基礎(chǔ)上,我們可以更好的預(yù)測(cè)數(shù)據(jù)庫(kù)的性能瓶頸,提前為之做好準(zhǔn)備工作。
2. 數(shù)據(jù)的規(guī)范化
當(dāng)使用blob類型的數(shù)據(jù)存儲(chǔ)大量圖片或者視頻時(shí),我們可能需要規(guī)范化數(shù)據(jù)。該技術(shù)將blob數(shù)據(jù)從原始表中提取出來(lái),存儲(chǔ)到新的表中,進(jìn)而可以將數(shù)據(jù)庫(kù)的性能和空間放大到更優(yōu)狀態(tài)。
規(guī)范化數(shù)據(jù)還可以降低系統(tǒng)維護(hù)的成本,通過(guò)拆分?jǐn)?shù)據(jù)視圖,我們可以逐步優(yōu)化數(shù)據(jù)庫(kù)操作,實(shí)現(xiàn)更加精細(xì)化的管理方式。
3. 使用壓縮算法
當(dāng)我們需要保存特別大的圖片和視頻時(shí),可以使用壓縮算法將數(shù)據(jù)壓縮,并以二進(jìn)制格式存儲(chǔ)在blob字段中。壓縮算法廣泛應(yīng)用于音頻和視頻文件的存儲(chǔ),常用的算法包括LZW、LZO、gzip等等。
壓縮算法可以使數(shù)據(jù)占用的存儲(chǔ)空間減少,同時(shí)還可以減少網(wǎng)絡(luò)中數(shù)據(jù)的傳輸量,加速數(shù)據(jù)的傳輸速度。但是,壓縮算法可能導(dǎo)致一定的性能損失,尤其是在解壓縮操作的過(guò)程中。
4. 使用數(shù)據(jù)庫(kù)管理工具
當(dāng)我們需要管理blob字段大小時(shí),還可以使用數(shù)據(jù)庫(kù)管理工具進(jìn)行優(yōu)化。例如,在MySQL中,可以使用存儲(chǔ)過(guò)程和觸發(fā)器來(lái)應(yīng)用諸如壓縮算法等優(yōu)化技術(shù)。
還可以使用數(shù)據(jù)遷移工具來(lái)將數(shù)據(jù)從磁盤放入Blob字段中,以節(jié)省磁盤存儲(chǔ)等方面的資源。在使用數(shù)據(jù)庫(kù)工具時(shí),我們還需要了解存儲(chǔ)過(guò)程和優(yōu)化表的知識(shí),以保證操作的順利執(zhí)行和數(shù)據(jù)的穩(wěn)定性。
5. 使用云存儲(chǔ)
在處理大規(guī)模數(shù)據(jù)存儲(chǔ)時(shí),我們還可以使用云存儲(chǔ)技術(shù)。云存儲(chǔ)是一種分布式系統(tǒng),可以在多個(gè)不同設(shè)備上進(jìn)行數(shù)據(jù)的存儲(chǔ)和傳輸,進(jìn)而減少單個(gè)設(shè)備的負(fù)擔(dān)。
云存儲(chǔ)可以保證數(shù)據(jù)的安全性和穩(wěn)定性,同時(shí)還可以提升系統(tǒng)的可用性和靈活性?,F(xiàn)在,許多大型網(wǎng)站和企業(yè)也已經(jīng)開(kāi)始采用云存儲(chǔ)技術(shù),以緩解數(shù)據(jù)存儲(chǔ)和管理的壓力。
在數(shù)據(jù)庫(kù)管理中,blob字段是一種重要的數(shù)據(jù)類型,可以存儲(chǔ)大量二進(jìn)制數(shù)據(jù),例如圖片、視頻等等。然而,隨著數(shù)據(jù)大小不斷增長(zhǎng),管理blob字段大小變得更加困難。
本文介紹一些在數(shù)據(jù)庫(kù)中管理blob字段大小的技術(shù),包括預(yù)估大小、規(guī)范化數(shù)據(jù)、使用壓縮算法、使用數(shù)據(jù)庫(kù)管理工具和云存儲(chǔ)等等。當(dāng)您使用這些技術(shù)時(shí),有機(jī)會(huì)使數(shù)據(jù)庫(kù)管理更加專業(yè)和高效,進(jìn)而實(shí)現(xiàn)更高的性能和空間管理。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220blob插入oracle 長(zhǎng)度為0
1.使用jdk中的方法進(jìn)行傳輸。在ResultSet 中有g(shù)etBlob()方法,在PreparedStatement中有setBlob()方法,所以大多數(shù)人都會(huì)嘗試setBlob
(),getBlob() 進(jìn)行讀寫,或者兩個(gè)數(shù)據(jù)庫(kù)之間BLOB的傳輸。這種方法實(shí)際上是行不通的,據(jù)網(wǎng)上的一些資料介紹,說(shuō)sun官方的文檔有些方法
都是錯(cuò)誤的。
2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream對(duì)BLOB進(jìn)行讀寫或兩個(gè)數(shù)據(jù)庫(kù)間的傳輸。這種方法我自己嘗試過(guò),
發(fā)現(xiàn),如果BLOB中存儲(chǔ)的是文本文件的話,就沒(méi)問(wèn)題,如果是二進(jìn)制文件,傳輸就會(huì)有問(wèn)題。
根據(jù)自己的經(jīng)驗(yàn),以及查閱了Oracle的官方文檔,都是使用如下處理方法:
1.新建記錄,插入BLOB數(shù)據(jù)
1.1首先新建記錄的時(shí)候,使用oracle的函數(shù)插入一個(gè)空的BLOB,假設(shè)字段A是BLOB類型的:
insert xxxtable(A,B,C) values(empty_blob(),’xxx’,’yyyy’)
1.2后面再查詢剛才插入的記錄,然后更新BLOB,在查詢前,注意設(shè)置Connection的一個(gè)屬性:
conn.setAutoCommit(false);如果缺少這一步,可能導(dǎo)致fetch out of sequence等異常.
1.3 查詢剛才插入的記錄,后面要加“ for update ”,如下:
select A from xxxtable where xxx=999 for update ,如果缺少for update,可能出現(xiàn)row containing the LOB value is not locked
的異常
1.4 從查詢到的 BLOB字段中,獲取blob并進(jìn)行更新,代碼如下:
BLOB blob = (BLOB) rs.getBlob(“A”);
OutputStream os = blob.getBinaryOutputStream();
BufferedOutputStream output = new BufferedOutputStream(os);
后面再使用output.write方法將需要寫入的內(nèi)容寫到output中就可以了。例如我們將一個(gè)文件寫入這個(gè)字段中:
BufferedInputStream input = new BufferedInputStream(new File(“
byte buff = new byte; //用做文件寫入的緩沖
int bytesRead;
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
output.write(buff, 0, bytesRead);
System.out.println(bytesRead);
}
上面的代碼就是從input里2k地讀取,然后寫入到output中。
1.5上面執(zhí)行完畢后,記得關(guān)閉output,input,以及關(guān)閉查詢到的ResultSet
1.6最后執(zhí)行conn.commit();將更新的內(nèi)容提交,以及執(zhí)行conn.setAutoCommit(true); 改回Connction的屬性
2.修改記錄,方法與上面的方法類似,
2.1首先更新BLOB以外的其他字段
2.2 使用1.3中類似的方法獲取記錄
2.3 修改的過(guò)程中,注意以下:a 需要更新的記錄中,BLOB有可能為NULL,這樣在執(zhí)行blob.getBinaryOutputStream()獲取的值可能為
null,那么就關(guān)閉剛才select的記錄,再執(zhí)行一次update xxxtable set A = empty_blob() where xxx, 這樣就先寫入了一個(gè)空的BLOB(不是null),然后再
使用1.3,1.4中的方法執(zhí)行更新記錄.b 注意別忘了先執(zhí)行setAutoCommit(false),以及”for update”,以及后面的conn.commit();等。
3.讀取BLOB字段中的數(shù)據(jù).
3.1 讀取記錄不需要setAutoCommit(),以及 select ….for update.
3.2 使用普通的select 方法查詢出記錄
3.3 從ResultSet中獲取BLOB并讀取,如下:
BLOB b_to = (BLOB) rs.getBlob(“A”);
InputStream is = b_from.getBinaryStream();
BufferedInputStream input = new BufferedInputStream(is);
byte buff = new byte;
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
//在這里執(zhí)行寫入,如寫入到文件的BufferedOutputStream里
System.out.println(bytesRead);
}
通過(guò)循環(huán)取出blob中的數(shù)據(jù),寫到buff里,再將buff的內(nèi)容寫入到需要的地方
4.兩個(gè)數(shù)據(jù)庫(kù)間blob字段的傳輸
類似上面1和3的方法,一邊獲取BufferedOutputStream,另外一邊獲取BufferedInputStream,然后讀出寫入,需要注意的是寫入所用的
Connection要執(zhí)行conn.setAutoCommit(false);以及獲取記錄時(shí)添加“ for update ”以及最后的commit();
總結(jié)以上方法,其根本就是先創(chuàng)建空的BLOB,再獲取其BufferedOutputStream進(jìn)行寫入,或獲取BufferedInputStream進(jìn)行讀取
Java語(yǔ)言操作Oracle數(shù)據(jù)庫(kù)中的CLOB數(shù)據(jù)類型字段類型:blob,clob,nclob
說(shuō)明:三種大型對(duì)象(LOB),用來(lái)保存較大的圖形文件或帶格式的文本文件,如Miceosoft Word文檔,以及音頻、視頻等非文本文件,更大長(zhǎng)度是4GB。LOB有幾種類型,取決于你使用的字節(jié)的類型,Oracle 8i實(shí)實(shí)在在地將這些數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi)部保存??梢詧?zhí)行讀取、存儲(chǔ)、寫入等特殊操作。
我們所操作的clobtest_table中屬性是(字符型id,CLOB型picstr),目前我們假設(shè)一個(gè)大的字符對(duì)象str已經(jīng)包含了我們需要存入picstr字段的數(shù)據(jù)。而且connection對(duì)象conn已經(jīng)建立。以下的例子程序也因?yàn)椴幌胝加锰嗟目臻g,所以對(duì)拋出異常沒(méi)有寫。大家參考一下api doc。就可以知道該拋出什么異常了,此處僅僅告訴大家如何去寫。
代碼:
(1)對(duì)數(shù)據(jù)庫(kù)clob型執(zhí)行插入操作
*************************************************
java.sql.PreparedStatement pstmt = null;
ResultSet rs = null;
String query = “”;
conn.setAutoCommit(false);
query = “insert into clobtest_table(id,picstr) values(?,empty_clob())”;
java.sql.PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setString(1,”001″);
pstmt.executeUpdate();
pstmt = null
query = “select picstr from clobtest_table where id = ‘001’ for update”;
pstmt = con.prepareStatement(query)
rs= pstmt.executeQuery();
oracle.sql.CLOB clobtt = null;
if(rs.next()){
clobtt = (oracle.sql.CLOB)rs.getClob(1);
}
Writer wr = clobtt.getCharacterOutputStream();
wr.write(strtmp);
wr.flush();
wr.close();
rs.close();
con.commit();
?。?)通過(guò)sql/plus查詢是否已經(jīng)成功插入數(shù)據(jù)庫(kù)
*************************************************
PL/SQL的包DBMS_LOB來(lái)處理LOB數(shù)據(jù)。察看剛才的插入是否成功。使用DBMS_LOB包的getlength這個(gè)procedure來(lái)檢測(cè)是否已經(jīng)將str存入到picstr字段中了。如:
SQL> select dbms_lob.getlength(picstr) from clobtest_table;
?。?)對(duì)數(shù)據(jù)庫(kù)clob型執(zhí)行讀取操作
*************************************************
讀取相對(duì)插入就很簡(jiǎn)單了。基本步驟和一半的取數(shù)據(jù)庫(kù)數(shù)據(jù)沒(méi)有太大的差別。
String description = “”
query = “select picstr from clobtest_table where id = ‘001’”;
pstmt = con.prepareStatement(query);
ResultSet result = pstmt.executeQuery();
if(result.next()){
oracle.jdbc.driver.OracleResultSet ors =
(oracle.jdbc.driver.OracleResultSet)result;
oracle.sql.CLOB clobtmp = (oracle.sql.CLOB) ors.getClob(1);
if(clobtmp==null || clobtmp.length()==0){
System.out.println(“======CLOB對(duì)象為空 “);
description = “”;
}else{
description=clobtmp.getSubString((long)1,(int)clobtmp.length());
System.out.println(“======字符串形式 “+description);
}
數(shù)據(jù)庫(kù)字段太多,修改字段就會(huì)卡,添加也添加不了,提示字段大小大于多少,要把類型改成text或blob
添加不了,你可以嘗試將這個(gè)字段給個(gè)默認(rèn)值,或緩鏈磨者允許喚模為null
看你的情況應(yīng)該是數(shù)據(jù)庫(kù)表在設(shè)計(jì)的時(shí)候可能就有擾斗問(wèn)題
數(shù)據(jù)庫(kù)中blob字段大小的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫(kù)中blob字段大小,【技術(shù)分享】如何在數(shù)據(jù)庫(kù)中管理blob字段大小,blob插入oracle 長(zhǎng)度為0,數(shù)據(jù)庫(kù)字段太多,修改字段就會(huì)卡,添加也添加不了,提示字段大小大于多少,要把類型改成text或blob的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)是成都專業(yè)網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、SEO優(yōu)化、手機(jī)網(wǎng)站、小程序開(kāi)發(fā)、APP開(kāi)發(fā)公司等,多年經(jīng)驗(yàn)沉淀,立志成為成都網(wǎng)站建設(shè)第一品牌!
網(wǎng)站題目:【技術(shù)分享】如何在數(shù)據(jù)庫(kù)中管理blob字段大小(數(shù)據(jù)庫(kù)中blob字段大小)
轉(zhuǎn)載注明:http://www.dlmjj.cn/article/djgcgih.html


咨詢
建站咨詢
