先存進緩存資料庫中,如redis等。然後寫定時任務批量插入資料庫
❷ Java 批量大文件上傳下載如何實現
解決這種大文件上傳不太可能用web上傳的方式,只有自己開發插件或是當門客戶端上傳,或者用現有的ftp等。
1)開發一個web插件。用於上傳文件。
2)開發一個FTP工具,不用web上傳。
3)用現有的FTP工具。
下面是幾款不錯的插件,你可以試試:
1)Jquery的uploadify插件。具體使用。你可以看幫助文檔。
❸ java如何快速處理大數據
文件讀取:首先是一個文件上傳,數據入庫,10-200萬條不等,這里主要考慮到一次性讀取,JVM分配出來的棧內存不一定會夠(個人對內存這一塊還是處於一知半解的狀態,所以比較謹慎,若諸位大神有好的認知,希望評論留下地址分享一下),是依行讀取數據,設定一個批量值,當讀取的數據達到一定量之後,執行批量入庫操作,清空集合,再接著讀取。
//讀取文件內容
while((s = br.readLine())!=null){
//判斷是否達到單次處理量
if(num%leadingNum==0&&num!=0){
int a = stencDao.insertBatch(listBean);
if(a!=leadingNum){
flag = false;
}
//清空集合
listBean.clear();
}
String value = s.trim();
//將讀取到的內容放入集合中
if(!value.equals("")){
StencilCustomer bean = new StencilCustomer();
bean.setCustomerPhone(value);
bean.setLinkStencilId(id);
listBean.add(bean);
num ++;
}
}
數據處理:這里的思路也是將數據小化然後處理,這里使用了多線程,設定單個線程處理量,然後開啟多個線程處理,這里需要考慮你的伺服器的承載能力,如果線程開得太多了,處理不過來,會出現蹦死的情況。例如200萬數據,我開了20個線程,單個線程處理600條。
//建立一個線程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
minTaskNumber, maxTaskNumber, 3L, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(minTaskNumber),
new ThreadPoolExecutor.DiscardOldestPolicy());
//當正在執行的線程數達到最大執行線程數的時候等待
boolean flag = true;
while(flag){
Thread.sleep(1000);//休眠2ms查詢一次
int c = threadPool.getActiveCount();//線程池中活動中的線程數量
if(c<maxTaskNumber){
flag = false;
}
}
上面的代碼是我對線程池的一個控制,控制伺服器一直最大線程執行,Thread.sleep(1000);用while的時候,這個休眠最好不要去掉,去掉之後很影響執行效率
❹ 怎麼利用JAVA導入大數據量的文本文件數據到
首先從文件中讀取數據,每當讀完一條紀錄是,把它轉換成oracle的插入語句。你可以執行,也可以存在一個大字元串里,最後一起執行
❺ 從excel表格讀取數據用Java代碼實現批量上傳寫入資料庫
public static List<Student> parseExcel(){
//解析excel文件 獲取數據
//將每行數據當作一個Student對象放入list集合
List<Student> list = new ArryList<Student>();
...
return list;
}
public static void updateDataBase(Student stu){
//更新資料庫 將Student對象插入資料庫
...
}
public void main(String[] args){
List<Student> list = parseExcel();//讀取excel
for(Student stu:list){//遍歷集合向資料庫插入數據
updateDataBase(stu);
}
}
大致的寫了下 具體實現應該沒問題吧?
❻ java實現文件批量上傳是否需要將文件重命名(包括圖片,word文檔,錄音),保存到項目中需要注意哪些
要看復情況:
1. 若上傳文件直接保存成制資料庫中的blob欄位,那就無所謂文件名了;
2. 若上傳文件保存到伺服器的某個文件夾中,那麼為了避免重名,上傳的文件一定要重命名,做法一般是:首先生成一串不會和其他文件相同的名稱,例如序列的值、上傳時間(精確到毫秒)等;其次,將上傳的文件保存到該文件名中;最後,向資料庫中記錄原上傳的文件名、以及生成的文件名。這樣,向用戶顯示的是用戶上傳的名稱,但下載時按資料庫中的記錄按圖索驥即可。
❼ 用java完成圖片多張批量上傳的功能,還有就是後台的應該怎麼處理上傳的照片。
/*
*圖片上傳參數
*/
private File[] images;
private String[] imagesFileName;
private String[] imagesContentType;
加get set方法
req=ServletActionContext.getRequest();
//增加商品欄位到資料庫
Proct proct=new Proct();
ProctCategory proctCategory=null;
ProctCategoryBiz pcb=new ProctCategoryBizImpl();
System.out.println("third is:"+third_id+"ok");
if(third_id.equals("")){
proctCategory=pcb.getCategory(Integer.parseInt(second_id));
}else{
proctCategory=pcb.getCategory(Integer.parseInt(third_id));
}
proct.setCategory(proctCategory);
proct.setName(name);
proct.setPrice(Double.valueOf(price));
proct.setStock(Integer.parseInt(stock));
//上傳圖片到伺服器
String fileType = null;
String fileName = "";
if(pb.addProct(proct)){
for (int i = 0; i < images.length; i++) {
fileType = imagesFileName[i].substring(imagesFileName[i]
.lastIndexOf("."));
fileName = (new Date().getTime() + i + 1) + fileType;
File imageFile = new File(ServletActionContext.getServletContext()
.getRealPath("/files")
+ "/" + fileName);
(images[i], imageFile);
addImages("files/"+fileName);
System.out.println("路徑"+imageFile);
}
req.setAttribute("msg", "商品添加成功!");
return "success";
}else{
req.setAttribute("msg", "商品添加失敗!");
return "input";
}
❽ java項目,我上傳dbf文件,解析文件數據保存到資料庫里,數據量太大,速度太慢
您好,
ResultSet得相關參數代碼片斷,下面的代碼對類型判斷和轉換還不全面,如果還有其他欄位請自行添加
Java代碼
try {
ResultSetMetaData meta = rs.getMetaData();
int columnCount = meta.getColumnCount();
strutName = new String[columnCount];
strutType = new byte[columnCount];
rs.last();
int itemCount = rs.getRow();
rs.first();
data = new Object[itemCount][columnCount];
for (int i = 1; i <= columnCount; i++){
int type = (byte) meta.getColumnType(i);
//2是BigDecimal
if(type == 2){
strutType[i-1] = DBFField.FIELD_TYPE_N;
}
//12是String
else if(type == 12){
strutType[i-1] = DBFField.FIELD_TYPE_C;
}
//91是java.util.Date
else if(type == 91){
strutType[i-1] = DBFField.FIELD_TYPE_D;
}
strutName[i-1] = meta.getColumnName(i);
}
for (int i = 0; rs.next(); i++){
for (int j = 0; j < columnCount; j++){
Object da = rs.getObject(j+1);
if(da instanceof BigDecimal){
Double d = Double.parseDouble(da.toString());
data[i][j] = d;
}else{
data[i][j] = da;
}
}
}
}catch (Exception e){
e.printStackTrace();
}finally{
rs = null;
}
上面採用的是傳統方法進行導出dbf文件,如果大數據量導出時,就要先將文件生成到伺服器端,然後從response里拿輸入流,將剛生成的文件寫到客戶端,也就是多一個文件流寫入的過程。