2014-06-13 5 views
0

원격 웹 서비스 &에서 데이터를 가져 와서 Oracle 데이터베이스로 푸시 할 응용 프로그램을 작성 중입니다.오라클 효율성을 갖춘 Java PreparedStatement?

이제 데이터는 이벤트 기반이므로 INSERT/UPDATE 또는 DELETE 일 수 있습니다. 이를 위해 preparedStatement &의 단일 객체를 만든 다음 이벤트 유형에 따라 코드가 문자열을 만듭니다. &은 준비된 명령문에 할당합니다.

이제 각 검색 이벤트 오라클에 테이블 이름 월 각 이벤트를 검색 한 후에, 문자열이 동작 & 후 실행 PreparedStatement 객체 &에 전달되고 수행되는 테이블에 기초하여 생성되므로, 따라서 질의 &을 변경한다.

하지만, 나는이 2 문제를했습니다 - 내가 생각

  1. , 내가 된 PreparedStatement에 대한 DB 캐싱 메커니즘은 많은 도움이 될 것입니다 경우 쿼리가 확실하지 않은 변경 때마다 때문에, 효율적으로 준비된 문을 사용하지 않는 이 경우에.

  2. 또한 내 모든 문장은 INSERT, UPDATE 또는 DELETE 중 하나이므로 pstmt.executeUpdate()를 사용하고 있습니다. 이제는 조작으로 영향을받는 행 수를 반환합니다. 하지만, 나는 "최대 오픈 커서 확장 오류"를지고 있어요 ... 많은 문을 & 내 결과가 결과를 반환하지 않기 때문에, & 각 작업 후 효율적으로, 내가 어떻게이 오류를 처리해야 잘 모르겠 preparedstatement 폐쇄 닫습니다. DB에서 열린 커서 수를 늘릴 수 있지만 나쁜 시나리오가 발생할 때까지 오류 만 지연 될 수 있으므로 응용 프로그램이 수정되지 않습니다.

getEvents()

for (i = 0 -> lastevent) 
{ 

    if (event == condition1) 
    { 
    Process.condition1(arg1, arg2) 
    } 
    else if (event == condition2) 
    { 
    Process.condition2(arg1, arg2) 
    } 
    . 
    . 
    . 
} 

pstmt.close(); 
connection.close(); 

프로세스 클래스

{ 
    condition1(arg1, arg2) 
    { 
    sqlstatement = "INSERT INTO Table1 (column1, column2, column3,...) VALUES (?, ?, ?);" 

pstmt = connection.prepareStatement(sqlstatement); 

pstmt.setString(1, value1); 

pstmt.setInt(2, value2); 
. 
. 
. 

pstmt.executeUpdate(); 

connection.commit(); 

return; 

} 

condition2(arg1, arg2) 
    { 
    sqlstatement = "INSERT INTO Table2 (column1, column2, column3,...) VALUES (?, ?, ?);" 

pstmt = connection.prepareStatement(sqlstatement); 

pstmt.setString(1, value1); 

pstmt.setInt(2, value2); 
. 
. 
. 

pstmt.executeUpdate(); 

connection.commit(); 

return;  

} 
} 

죄송합니다, 나는 위의 모든 과정이 완료되는 방법에 대한 몇 가지 아이디어를 줄 수 추측 ... 나는 'didn를 실제 코드를 넣으면 다양한 클래스들 사이에 분산되어 있습니다. & 원격 서비스에서 위치 매개 변수에 대한 데이터를 얻습니다. 그러나 위의 내용은 어떻게 수행되고 있는가를 요약 한 형태입니다.

& 비슷한 종류의 이벤트를 처리 할 수도 있지만 내 비즈니스 요구 사항이 & 인 방식으로 원격 서비스가 데이터를 제공하는 방식으로 오류가 발생하기 쉽습니다.

또한 oracle &의 일부 테이블에는 130 개 이상의 열이 있으며이 코드는 15 분마다 150 개 이상의 이벤트를 처리합니다.

+1

어떻게'PreparedStatement'를 사용하는지 보여주십시오. –

+1

코드 제공을 요청했습니다. 이 사이트는 프로그래머 용이며 코드/디자인에 문제가 있으므로 코드를 게시하여 현재 디자인을 확인하십시오. 최종 사용자로서 코드에 대해 질문하지 마십시오. –

+0

짧은 대답 : 바퀴를 재발견하려하지 않습니다. myBatis (iBatis) 또는 최대 절전 모드를 사용하십시오. – DwB

답변

0

"준비된 문에 쿼리 문자열 지정"이 불가능합니다. 준비된 명령문은 코드에 표시된대로 쿼리 문자열로 생성됩니다. connection.prepareStatement(sqlstatement)을 호출 할 때마다 준비된 새로운 명령문이 작성됩니다. 이것은 "너무 많은 열린 커서"오류가 발생하는 이유이기도합니다. 이전에 생성 된 pstmt은 절대로 닫히지 않습니다.설치에 한 번만 사용할 수 있습니다 (작업이 완료되면 폐쇄) 준비된 문이라고

Process 클래스를 인스턴스화하고 그것에게 init 방법을 제공 (그리고 close 방법 해당), 준비된 문을 다시 사용하려면 :

PreparedStatement insertTable1; 
PreparedStatement insertTable2; 

void init(Connection c) { 
    insertTable1 = c.prepareStatement(INSERT_TABLE1_QUERY); 
    insertTable2 = c.prepareStatement(INSERT_TABLE2_QUERY); 
} 
void close() { 
    insertTable1.close(); 
    insertTable2.close(); 
} 
void condition1(Connection c, arg1, arg2) { 
    insertTable1.setString(1, value1); 
    insertTable1.setInt(2, value2); 
    insertTable1.executeUpdate(); 
    c.commit(); 
} 
void condition2(Connection c, arg1, arg2) { 
    insertTable2.setString(1, value1); 
    insertTable2.setInt(2, value2); 
    insertTable2.executeUpdate(); 
    c.commit(); 
}