2012-04-26 3 views
3

이전 오라클 서버에서 JDBC를 사용하는 데있어 혼란스럽고 이상한 문제가 있습니다. 나는 약 10 열, 숫자, varchars, 원시 (255) 및 날짜, 제한 없음, 키 없음 등으로 테이블을 준비했습니다. 그면에서 모든 것이 빠른 것 같습니다. 그 후, 내 응용 프로그램은 정말 느린 것 같았습니다 (약 30-50 초 내에 25,000 개의 데이터를 삽입합니다 ...). 내 환경은 거의 최신의 1.6 JDK, 10.2.0 Oracle의 ojdbc14 드라이버입니다. 그래서 코드 부분을 잘라내어 별도로 테스트했습니다. 코드에 대한 배경 정보는 여기에 있습니다.오라클에서 느린 일괄 업데이트

Class.forName("oracle.jdbc.driver.OracleDriver"); // I tried with oracle.jdbc.OracleDriver too 
Connection conn = DriverManager.getConnection("thin url", "user", "pass"); 
conn.setAutoCommit(false); 
PreparedStatement pstmt = conn.prepareStatement(SQL_STMT); // SQL_STMT is a simple <i>INSERT INTO tablename (column1, column2, column3) VALUES (value1, value2, value3)</i> command with 10 parameters 

for(int i = 0; i < numOfData; ++i) { 
    pstmt.setObject(objects[i]); // objects has the data for example. I also tried setInt, setDate, etc with the corresponding types, does not speeds it up 
    pstmt.addBatch(); 
} 
pstmt.executeBatch(); 
conn.commit(); 
conn.setAutoCommit(true); 
pstmt.close(); 
conn.close(); 

저는 이것이 매우 간단하다고 생각합니다. 또한 로컬 H2 DB를 사용하여이 작업을 시도해 보았습니다.이 작업은 멋지게 빠르며 같은 구조에 50 만 개 데이터를 삽입하기 위해 0ms가 걸렸습니다 (분명히 0ms가 아니라 너무 빨라 측정 할 수 없었습니다). 나는 오늘 ojdbc6와 새로운 오라클로 시도 할 것이다. 내 의혹은 ojdbc14 드라이버와 jdk 1.6.idontknow가 서로 몇 가지 문제가 있다는 것입니다. FINEST 레벨로 가 executeBatch 작업시

은 내가 ojdbc14을 추적하고 나는 생각의 전환, oracle.jdbc.driver.DBConversion.stringToDriverCharBytes 등의 수천을 보았다. 대부분의 시간은이 코드들과 함께 전달되었고 마지막 명령은 내가 본 것처럼 "진짜 거래"였습니다. 커밋, pstmt 등의 매개 변수 설정은 느리지 만 executeBatch는 아닙니다.

이 오래된 jdbc 드라이버로 읽는 것이 빠르다. 단지 삽입이 끔찍하게 느리다.

여러분 중 누구라도 아이디어가 있으십니까? 어떤 종류의 드라이버를 사용하여 이러한 빠른 작업을 수행하고 최소한 기본 작업으로 모든 사용 가능한 DB와 호환 될 수 있습니까?

+0

사과와 사과를 비교하고 있습니까? 예를 들어, Oracle 인스턴스가 원격 서버 인 경우 네트워크 지연 시간을 계산합니까? – Nick

+0

글쎄 그것은 원격이지만 오라클 db-s에 대한 이전 프로젝트와 경험을 토대로 한 비교가 있었고 사실을 말하면 위층의 코드는 분명히 예상보다 느립니다. 그리고 나는 시간이 있다면 원인을 찾으려고 아직도 노력하고 있습니다. 나는 며칠 전에 정확한 드라이버를 가진 DB로 이것을 시도했지만, 느린 속도였습니다. 그러나 이것보다 느리지는 않았습니다. 그러나이 테스트는 예상 속도를 훨씬 뛰어 넘었습니다. – newhouse

+0

* "예상 시간"을 의미 함 – newhouse

답변

0

"수천 회의 변환"으로 인한 대기 시간을 고려할 때 Oracle OCI 드라이버를 사용하는 것이 좋습니다. 네이티브 코드로 작성되었으므로 대개 나보다 빠릅니다. 그 외에도 네트워크 대기 시간 문제 일 가능성이 큽니다.

+1

오라클 자체 (JDBC 설명서) 씬 드라이버가 OCI 드라이버보다 빠르다고 주장합니다. –