JDBC 大資料和批處理

2021-08-01 09:23:04 字數 4300 閱讀 4096

目標:把***儲存到資料庫中!

在my.ini中新增如下配置!

max_allowed_packet=10485760

blob (binary large object): 二進位製大物件–>位元組資料大物件

clob(chractor large object): 字元資料大物件

1.什麼是sql當中的大資料

所謂sql當中的大資料,就是大的位元組資料,或大的字元資料。

標準sql中提供了如下型別來儲存大資料型別:

型別長度

tinyblob

28–1b(256b)

blob

216-1b(64k)

mediumblob

224-1b(16m)

longblob

232-1b(4g)

tinyclob

28–1b(256b)

clob

216-1b(64k)

mediumclob

224-1b(16m)

longclob

232-1b(4g)

但是,在mysql中沒有提供tinyclob、clob、mediumclob、longclob四種型別,

mysql當中沒有字元資料大物件,只有位元組資料大物件

字元資料物件主要用來處理文字,位元組資料物件可以用來處理一切形式的資料。

在mysql當中用來處理文字的大資料物件是下面的格式

使用如下四種型別來處理文字大資料: 型別

長度tinytext

28–1b(256b)

text

216-1b(64k)

mediumtext

224-1b(16m)

longtext

232-1b(4g)

首先我們需要建立一張表,

表中要有乙個mediumblob(16m)型別的字段。

create

table tab_bin(

id int

primary

key auto_increment,

filename varchar(100),

data mediumblob

);

向資料庫插入二進位制資料需要使用preparedstatement物件的setbinarystream(int, inputsteam)方法來完成。

pstmt.executeupdate();讀取二進位制資料,

需要在查詢後使用resultset類getbinarystream()方法來獲取輸入流物件。

也就是說,

preparedstatementset***()

那麼resultset就有get***()

con = jdbcutils.getconnection();

string sql = "select filename,data from tab_bin where id=?"

;pstmt = con.preparestatement(sql);

pstmt.setint(1, 1);

rs = pstmt.executequery();

rs.next();

string filename = rs.getstring("filename");

outputstream out = new fileoutputstream("f:\\" + filename);

inputstream in = rs.getbinarystream("data");

ioutils.copy(in, out);

out.close();

還有一種方法,

就是把要儲存的資料報裝成blob型別,

然後呼叫preparedstatement的setblob()方法來設定資料

byte datas = fileutils.getbytes(file);//獲取檔案中的資料

blob blob = new serialblob(datas);//建立blob物件

pstmt.setblob(2, blob);//設定blob型別的引數

pstmt.executeupdate();

con = jdbcutils.getconnection();

string sql = "select filename,data from tab_bin where id=?"

;pstmt = con.preparestatement(sql);

pstmt.setint(1, 1);

rs = pstmt.executequery();

rs.next();

string filename = rs.getstring("filename");

file file = new file("f:\\" + filename) ;

blob blob = rs.getblob("data");

byte datas = blob.getbytes(0, (int)file.length());

fileutils.writebytearraytofile(file, datas);批處理就是一批一批的處理,而不是乙個乙個的處理!

當你有10條sql語句要執行時,一次向伺服器傳送一條sql語句,

這麼做效率上很差!處理的方案是使用批處理,

即一次向伺服器傳送多條sql語句,然後由伺服器一次性處理。

批處理只針對更新(增、刪、改)語句,

批處理沒有查詢什麼事兒!

可以多次呼叫statement類addbatch(string sql)方法,

把需要執行的所有sql語句新增到乙個「批」中,

然後呼叫statement類executebatch()方法

來執行當前「批」中的語句。

for(int i = 0; i < 10; i++) 

stmt.executebatch();

當執行了「批」之後,

「批」中的sql語句就會被清空!

也就是說,連續兩次呼叫executebatch()相當於呼叫一次!

因為第二次呼叫時,「批」中已經沒有sql語句了。

還可以在執行「批」之前,呼叫statement的clearbatch()方法來清空「批」!

preparedstatement的批處理有所不同,

因為每個preparedstatement物件都繫結一條sql模板。

所以向preparedstatement中新增的不是sql語句,

而是給「?」賦值。

con = jdbcutils.getconnection();

string sql = "insert into stu values(?,?,?,?)"

;pstmt = con.preparestatement(sql);

for(int i = 0

; i < 10; i++)

pstmt.executebatch();

JDBC處理大資料 二進位制資料和批處理

例如,文字資料 儲存 preparestatement.setcharacterstream index,fis,length nt index 是預編譯sql語句中大文字資料的引數索引位置 fis 大文字資料的輸入流 length 大文字資料的長度 獲取 方法一 reader resultset....

JDBC處理大資料

使用mysql資料庫也可以處理大資料,在實際開發中需要把大文字或者二進位制資料儲存到資料庫中去。clob是用來儲存大文字的,mysql資料庫不支援。bclob用於儲存二進位制資料,例如 影象 聲音 二進位制檔案等。對於mysql的text型別,可呼叫如下方法設定 preparedstatment.s...

JDBC 批處理 插入大量資料

使用jdbc向資料庫插入100000條記錄,分別使用statement,preparedstatement,及preparedstatement 批處理3種方式進行測試 1 使用statement插入100000條記錄 public void exec connection conn catch s...