2013-10-29 79 views
0

我正在嘗試使用在blob列後面的字段中找到的值從blob中提取文件。我的解決方案有效,但速度很慢。從Oracle blob字段提取文件;

我在大約1小時內提取了169MB(727個不同的文件)。這大概是每分鐘12個文件。 大部分文件通常在5KB到50KB之間,但有時可能大到2MB。我正在使用本地Oracle數據庫。

有什麼我可以做的,使我的代碼更有效率?如果不是,還有哪些其他因素可能會影響流程的速度?以下是該方法的代碼:

public void beginExtraction(String FileOutDir, String blobSQL, 
     String fileSuffix, Connection conn) { 

    if ((FileOutDir != null) && (blobSQL != null) && (conn != null)) { 
     PreparedStatement selBlobs = null; 
     FileOutputStream fos = null; 

     if (conn != null) { 
      if (blobSQL != null) { 
       try { 

        selBlobs = conn.prepareStatement(blobSQL); 
        ResultSet rs = selBlobs.executeQuery(); 
        int cols = rs.getMetaData().getColumnCount(); 

        while (rs.next()) { 

         Blob blob = rs.getBlob(1); 
         InputStream is = blob.getBinaryStream(); 

         String filepath = ""; 

         filepath += FileOutDir + "/"; 

         for (int c = 2; c <= cols; c++) { 
          filepath += rs.getObject(c).toString() + "_"; 
         } 

         filepath = filepath.substring(0, 
           filepath.length() - 1); 
         filepath += fileSuffix; 
         fos = new FileOutputStream(filepath); 

         int b = 0; 
         while ((b = is.read()) != -1) { 
          fos.write(b); 
         } 

        } 

        selBlobs.close(); 
        fos.close(); 

       } catch (Exception e) { 
        JOptionPane.showMessageDialog(gui, e.toString()); 
       } 
      } 
     } 
    } else { 
     if (conn == null) { 
      JOptionPane.showMessageDialog(gui, 
        "You have not selected a database."); 
     } else { 
      if (FileOutDir == null) { 
       JOptionPane.showMessageDialog(gui, 
         "You have not chosen a directory for your files."); 
      } else { 
       if (blobSQL == null) { 
        JOptionPane.showMessageDialog(gui, 
          "Please insert an SQL statement."); 

       } 
      } 
     } 
    } 
} 
+0

也許嘗試使用緩衝輸入和輸出流? –

+0

不是緩衝輸入和緩衝輸出與輸入和輸出相同,但具有更多功能? – Native

+3

緩衝的輸入和輸出使讀取和寫入緩衝的操作,所以他們應該更快地讀取和寫入 - 而不是讀取和逐字節寫入,你可以做它塊。試一試。 –

回答

1

更改爲緩衝輸出使進程以指數方式更快。我能夠在一分鐘內導出727個文件。這裏的新代碼:

//... 

        while (rs.next()) { 

         blob = rs.getBlob(1); 
         is = blob.getBinaryStream(); 
         filepath += "/"; 

         for (int c = 2; c <= cols; c++) { 
          filepath += rs.getObject(c).toString() + "_"; 
         } 
         filepath = filepath.substring(0, 
           filepath.length() - 1); 
         filepath += fileSuffix; 

         fos = new BufferedOutputStream(new FileOutputStream(filepath)); 

         while ((b = is.read()) != -1) { 
          fos.write(b); 
         } 

         filepath = FileOutDir; 
         b = 0; 
        } 

//... 
+0

現在還有其他問題,似乎有些文件丟失了一些數據。我在這裏問了另一個問題:http://stackoverflow.com/questions/19686232/extracting-blobs-to-files-some-files-are-missing-data – Native