資料匯入功能實現心得

2021-06-21 15:33:25 字數 1652 閱讀 5272

剛接到這個需求感覺很簡單,看大致意思主要是,從excel中讀取資料並寫入到資料庫中,唯一特殊之處是有一列大字段(超過4000個字元,在資料庫中需要用clob型別儲存)需特殊處理。想了下把**寫好了。開始測試發現,匯入一條資料需要8秒左右,按這速度導20萬資料的話,不敢往下想了,於是想著**調優,優化以後速度變成了一分鐘匯入一千多條。以此為背景,分享下修改過程中的心得。

過程中遇到很多問題,但都順利解決,下面羅列下主要遇到的問題以及有效解決方式。

問題1:如何獲取合併單元格的值?

解決方式:

public static void insertdata(string sjly, file excelfile, string tablename) 

}}}

問題2:獲取當前時間比系統時間晚8個小時

解決方法:

在獲取當前時間的**前設定時區,**如下所示:

timezone tz =timezone.gettimezone("asia/shanghai");

timezone.setdefault(tz);

string nowtime=new ******dateformat("yyyy-mm-dd hh:mm:ss").format(calendar.getinstance().gettime());

問題3:clob型別字段處理

解決方式:由於excel中部分資料列超過4000字元,varchar2不夠用,因此可使用clob資料型別對這些大資料量的資料列進行儲存。而lob資料不能像其它型別資料一樣直接插入(insert)。插入前必須先插入乙個空的lob物件,clob型別的空物件為empty_clob (),之後使用帶「for update」的查詢語句鎖定更新行,繼而將空物件修改為所要插入的lob物件。對於clob資料的修改,可在修改該錶的其他字段資訊時同時將clob欄位修改為empty_clob (),然後才對clob欄位單獨修改。

問題4:向clob物件中寫入資料

解決方式:

string update_sql = "select gsxx  from " + tablename + " where id='"+id+"' for update";

conn.setautocommit(false);

rs = conn.createstatement().executequery(update_sql);

if (rs.next()) catch (ioexception e)

}

rs.close();

conn.commit();

conn.setautocommit(true);

這樣寫單條的時候問題不大,當有大資料時會報:ora-00604: 遞迴 sql 級別 1 出現錯誤,ora-01000: 超出開啟游標的最大數

的錯誤,

解決方式:將  rs = conn.createstatement().executequery(update_sql);  

改為:stmt = conn.createstatement();

rs = stmt.executequery(update_sql);

並在關閉rs物件時同時關閉stmt 物件即可解決。

VSTO 系列(02) 實現資料匯入功能

之所以基於 excel 開發外掛程式,乙個重要的原因就是 excel 在資料展示 分析和處理的靈活性。本篇實現從資料庫中基於 sql 將資料匯入到 excel 工作表。考慮到 ms access 是微軟資料庫,visual studio 天然支援,本例的資料庫使用 ms access 資料庫。從資料...

ODPS功能介紹之資料匯入

在使用odps強大的資料處理能力之前,大家最關心的是自己的資料如何匯入到odps中。下面介紹一款向odps匯入資料的工具 fluentd。使用這款軟體,向odps匯入資料,需要具備如下環境 ruby 2.1.0 或更新 gem 2.4.5 或更新 fluentd 0.10.49 或從fluentd ...

實現資料匯入 匯入模式 匯入案列

匯入模式 模式 引數 說明 操作角色 full full 匯入整個資料庫 imp full database schema schmas 匯入使用者模式中的資料和元資料 imp full database table tables 匯入表和表分割槽的資料和元資料 imp full database ...