2012-06-22 2 views
1

제 질문은 무언가를하는 방법과 관련이 없으므로, 성능 향상에 도움이됩니다. 나는 긴 게시물에 대해 사과하지만, 성능에 관한 것이므로 누군가가 도움을 줄 수 있는지 알아보기 위해 내가하고있는 일에 대한 모든 세부 정보를 게시해야한다고 생각했습니다.자바에서 BLOB를 사용하여 Pefromance를 향상 시키십시오.

2 개의 다른 데이터베이스에서 정보를 가져 와서 메타 데이터와 해당 BLOB (pdf 파일)을 생성하고 압축하는 프로그램을 만들어야합니다.
메타 데이터 파일은 BLOB 오브젝트가 데이터베이스에서 발견 된 경우에만 작성됩니다. 나는 그렇게 할 수 있었지만 문제는 때로는 쿼리에 최대 80,000 개의 결과가있을 수 있으며 그렇게하는 데 20 시간이 걸릴 수 있습니다. 이는 각 BLOB 개체가 100KB를 넘지 않는다는 것을 생각하면 어리 석습니다.

메타 데이터에 대한 모든 ID와 정보가 저장되는 트랜잭션 데이터베이스 (TEQ8P라고도 함)가 있습니다. 나는 최신 상태로 데이터를 쿼리

TEQ8P.openConnection(); 
Boolean flag = TEQ8P.ExecuteQuery("select tr.legaltransnumber, cc.country_code, tr.transnumber, tr.postingdate, tr.transdate from EQUATE.transheader tr inner join companycode_country cc on tr.tocompanycode = cc.company_code where tr.transtype = 'IC' and tr.transdate between to_date(" + date + ", 'DD/MM/YYYY') and to_date(" + nextday + ", 'DD/MM /YYYY')"); 

public Boolean ExecuteQuery(String query) { 
     Statement stmt; 
     ResultSet rs = null; 
     try { 
      stmt = connection.createStatement(); 
      rs = stmt.executeQuery(query); 
      if(!rs.isBeforeFirst()) 
       return false; 
      rowset = new CachedRowSetImpl(); 
      rowset.populate(rs); 
      metadata = rs.getMetaData();    
      rs.close(); 
      stmt.close(); 
      return true; 
     } catch (SQLException e) { 
      HLog.error(e.getMessage()); 
      e.printStackTrace(); 
      return false; 
      //System.out.println(query);    
     } 
     finally 
     { 
      closeConnection(); 
     } 
} 

내가 (다시 요구 사항에 따라) 자바 1.5를 사용하고 (짜증하지만 난 다른 필터가없는, 그 요구했다) 그래서에서 cachedrowsetimp 항아리를 다운로드 오라클은 데이터를 쿼리 한 후에 메모리에 저장하고 연결을 닫습니다.

그런 다음 나는 cachedrowset을 통해 이동하고웨어 하우스 DB에서 모든 ID를 조회하기 시작합니다. 나는 모든 ID를 찾을 수있는 방법이 없기 때문에 "where in"을 선택할 수 없다. "in"은 찾은 항목 만 리턴 할 것이고, 그렇지 않은 항목을 알지는 못한다. 발견. 그러나 만약 당신이 어떤 제안을하시기 바랍니다!

그래서 preparedStatement를 사용하여 ORACLE에서 바인드 변수를 사용하고 BLOB 객체를 작성하기 시작합니다.

첫 번째 질문은 Blob 파일을 작성하는 더 좋은 방법이 있습니까? 더 빠른 방법? 쿼리가 WarehouseDB에 해당 ID에 대한 결과를 발견하고 이미지가 (이 널 예외로 이동하지 않습니다 의미) null가 아닌 경우

if(flag)  
    { 
     String Query = "select wh.transnumber, wh.image from EQUATEWH.legalimage wh where wh.transnumber = ?"; 
     WEQ8I.openConnection(); 
     WEQ8I.setPreparedStmt(Query); 
     WEQ8I.WriteBlobs(PDF, TEQ8P.getRowsSet(), IC_FILE);  
     WEQ8I.closePrepStmt(); 
     WEQ8I.closeConnection(); 
     FileUtils.createZip(prop.getProperty("ZIPDIR_IC"), lsize, prop.getProperty("ZIPNAME_IC")); 

public void WriteBlobs(String path, CachedRowSetImpl set, IMP_File IC_FILE) 
{ 
    ResultSet rs = null; 
    try 
    { 
     while(set.next()) 
      {     
       pstmt.setString(1, set.getString(3)); 
       rs = pstmt.executeQuery(); 
       if(!rs.isBeforeFirst()) 
       { 
        System.out.println("invoice " + set.getString(3) + "was not found on W database"); 
        ErrorFile.writeErrorFile(set.getString(3)); 
       } 
       else 
       { 
        //getting the name of the PDF file, if no ID use legaltransnumber 
        String ID = set.getString(1); 
        if(ID == null) 
        { 
         ID = set.getString(3); 
        } 
        while(rs.next()) 
        { 
         FileOutputStream fos = null; 
         try 
         { 
          Blob blob = rs.getBlob(2); 
          InputStream is = blob.getBinaryStream(); 
          fos = new FileOutputStream(path + ID + ".pdf"); 
          int i = 0; 
          while ((i = is.read()) != -1) 
          { 
           fos.write(i); 
          } 
          fos.close(); 
          is.close(); 
          IC_FILE.fillIMPFile("IC", ID, set.getString(3), set.getString(2), set.getString(5)); 
         }catch (Exception e) 
         { 
          e.printStackTrace(); 
          ErrorFile.writeErrorFile(set.getString(3)); 
         } 
        }       
       } 
       rs.close();     
      } 
     IC_FILE.writeFile(); 

    } catch (SQLException e) 
    { 
     System.out.println("Problem when trying to create Record: " + path); 
     HLog.error(e.getMessage()); 
     e.printStackTrace(); 
     try 
     { 
      ErrorFile.writeErrorFile(set.getString(3)); 
     }catch (Exception ex) 
     { 
      ex.printStackTrace(); 
      HLog.error(e.getMessage()); 
     } 
    } 

} 

, 나는 IC_FILE 인 metadafile을 만듭니다. IC_FILE은 파일을 쓰지 않으며, 모든 것을 메모리에 저장하고 파일을 완료하면 파일을 쓰고, 모든 파일에 대해 I/O 작업을 한 번만 수행 할 필요가 없으므로 성능 향상에 도움이 될 것이라고 생각했습니다. IC_FILE.writefile().

메타 데이터 파일을 만들려면 파일에서 컨테이너 이름을 다시 가져와야합니다. 컨테이너 이름을 검색하려면 Transactional 데이터베이스에서 3 개의 필드를 사용하고 이들을 연결하여 해당 파일에서 검색해야합니다. 이 내가 먼저 각 레코드에서 데이터를 가져 오려면 IMP 파일을 만드는 방법은 다음과 같습니다

public void fillIMPFile(String type, String ID, String ID2, String companyCode, String date) 
{ 
    date = date.substring(0, 10); 
    date = date.replace("-", "/"); 
    date = date.substring(5, 7) + "/" + date.substring(8, 10) + "/" + date.substring(0, 4); 
    String Name = prop.getProperty("NAME"); 
    String info = prop.getProperty(type); 
    String DOS = Name + info + ID + "."; 
    String NOTES = Name + " " + info + " "; 
    info += getContainer(companyCode, date, type); 


    if(type.equals("IC")) 
    { 
     String desc = prop.getProperty("DESC_PDF"); 
     DOS += "pdf"; 
     NOTES += desc + " " + ID + " " + ID2; 

     buffer += info + "\t" + date + "\t" + date + "\t" + DOS + "\t" + NOTES + "\t" 
       + NOTES + "\t" + ID2; 
    } 

내가 속성이 객체를 사용하여 컨테이너를 얻으려면,하지만 난 더 나은 선택이있을 수 있습니다 생각? 아마 해시지도?

마침내
public String getContainer(String companyCode, String Date, String type) 
{ 
    Calendar cal = Calendar.getInstance(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); 
    Date = sdf.format(cal.getTime()); 
    //mal siempre pondra 2012 
    String data = type + companyCode + Date; 
    String container = containers.getProperty(data); 

    if(container == null) 
    { 
     data = type + "WW" + Date; 
     container = containers.getProperty(data); 
    } 
    return container; 
} 

파일 쓰기 :

public void writeFile() 
{ 
    try 
    { 
     FileWriter fw = new FileWriter(File, true); 
     BufferedWriter bw = new BufferedWriter(fw); 
     bw.write(buffer); 
     bw.close(); 
    }catch (IOException e) 
    { 
     e.printStackTrace(); 
     HLog.error(e.getMessage()); 
    } 
} 

감사합니다! 다니엘

+0

이 컨테이너 파일이 2700 개 컨테이너 이름을 가지고 얘기를 깜빡 했네요 매년 1 개 이상의 컨테이너 파일을 생성, 그래서 하나 그것을 위해 한 검색 : S –

답변

0

고정 ... 바인드 변수를 사용하여

관련 문제