제 질문은 무언가를하는 방법과 관련이 없으므로, 성능 향상에 도움이됩니다. 나는 긴 게시물에 대해 사과하지만, 성능에 관한 것이므로 누군가가 도움을 줄 수 있는지 알아보기 위해 내가하고있는 일에 대한 모든 세부 정보를 게시해야한다고 생각했습니다.자바에서 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());
}
}
감사합니다! 다니엘
이 컨테이너 파일이 2700 개 컨테이너 이름을 가지고 얘기를 깜빡 했네요 매년 1 개 이상의 컨테이너 파일을 생성, 그래서 하나 그것을 위해 한 검색 : S –