이 기사에서는 대규모 데이터의 배치 처리 방법에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
최대 절전 모드 배치 처리 대량 양은 실제로 성능의 관점에서 바람직하지 않으며 많은 메모리가 낭비됩니다. 메커니즘에서 Hibernate는 먼저 조건을 충족하고 메모리에 넣은 데이터를 확인한 다음 작업을 수행합니다. 성능은 실제 사용에서 매우 불만족 스럽습니다. 실제로 사용하면 다음 세 번째 최적화 솔루션의 데이터는 다음과 같습니다. 10 만 개의 데이터가 데이터베이스에 삽입되어 약 30 분이 소요됩니다. 하하, 희미 해요. (10 분 안에 1000,000 조각의 데이터를 삽입했습니다 (필드는 비교적 작습니다))
성능 문제를 해결하기 위해이를 처리하는 세 가지 방법이 있습니다.
1 : 최대 절전 모드 API를 우회하고 JDBC API를 직접 사용하십시오. 이 방법은 더 나은 성능을 가지고 있습니다. 또한 가장 빠릅니다.
2 : 저장 절차를 사용하십시오.
3 : 최대 절전 모드 API를 사용하여 정기적 인 배치 처리를 수행하십시오. 변화가있을 수 있으며 변화가 바뀔 것입니다. 일정 금액을 찾으면 작업을 완료 한 후 시간에 데이터를 삭제할 수 있습니다. Session.flush (); 세션 .Evict (XX 객체 세트); 또한 성능 손실도 절약 할 수 있습니다. 이 "일정량"은 실제 조건에 따라 정량적 참조로 사용해야합니다. 일반적으로 약 30-60 정도이지만 그 효과는 여전히 이상적이지 않습니다.
1 : 최대 절전 모드 API를 우회하여 JDBC API를 통해 직접 수행하십시오. 이 방법은 성능이 향상되고 가장 빠릅니다. (예제는 업데이트 작업입니다)
트랜잭션 tx = session.begintransaction (); // 최대 절전 모드 트랜잭션 경계 연결을 사용하고 있습니다. conn = session.connection (); preparedstatement stmt = conn.preparedStatement ( "c 세트로 고객 업데이트 c.sarlary = c.sarlary+1 여기서 c.sarlary> 1000"); stmt.excuteupdate (); tx.commit (); // 최대 절전 모드 트랜잭션 경계를 사용하고 있습니다
이 애플릿에서는 JDBC를 직접 호출하여 데이터베이스에 액세스하는 API를 사용하여 매우 효율적입니다. 최대 절전 모드 먼저 쿼리 및 메모리로드로 인한 성능 문제를 피한 다음 작업을 수행합니다.
2 : 저장 절차를 사용하십시오. 그러나이 방법은 휴대 성 및 프로그램 배포의 편의로 인해 사용하지 않는 것이 좋습니다. (예제는 업데이트 작업입니다)
기본 데이터베이스 (예 : Oracle)가 저장 프로 시저를 지원하는 경우 저장 절차를 통해 배치 업데이트를 수행 할 수도 있습니다. 저장된 절차는 데이터베이스에서 직접 실행됩니다. Oracle 데이터베이스에서 BatchupDateCustomer ()라는 저장된 절차를 정의 할 수 있으며 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다. 절차 생성 또는 교체 BatchupDateCustomer (P_age)가 시작하여 업데이트 고객을 설정합니다.
위의 저장된 절차에는 매개 변수 p_age가 있으며, 이는 클라이언트의 나이를 나타냅니다. 응용 프로그램은 저장된 절차를 다음과 같은 방식으로 호출 할 수 있습니다.
tx = session.begintransaction (); Connection Con = session.connection (); String procedure = "{Call BatchUpDateCustomer (?)}"; CallAbleStmt = con.preparecall (절차); cstmt.setint (1, 0); // 연령 매개 변수를 0cstmt.executeUpdate (); tx.commit ()로 설정합니다.위 프로그램에서 알 수 있듯이 응용 프로그램은 또한 최대 절전 모드 API를 우회하고 JDBC API를 통해 직접 저장된 프로 시저를 통한해야합니다.
3 : 최대 절전 모드 API를 사용하여 정기적 인 배치 처리를 수행하십시오. 변화가있을 수 있으며 변화가 바뀔 것입니다. 일정 금액을 찾으면 작업을 완료 한 후 시간에 데이터를 삭제할 수 있습니다. Session.flush (); 세션 .Evict (XX 객체 세트); 또한 성능 손실도 절약 할 수 있습니다. 이 "일정 금액"은 실제 조건에 따라 정량적 참조가되어야합니다 ...
(예제는 저장 작업입니다)
비즈니스 로직은 : 데이터베이스에 10 0000 데이터를 삽입하려고합니다.
tx = session.begintransaction (); for (int i = 0; i <100000; i ++) {customer custom = new customer (); custom.setname ( "user"+i); session.save (custom); if (i%50 == 0) // 위에서 언급 한 모든 50 개의 데이터를 처리하는 것으로 간주해야합니다.이것은 시스템을 안정적인 범위로 유지합니다 ...
프로젝트 개발 프로세스 동안 프로젝트 요구 사항으로 인해 많은 양의 데이터를 데이터베이스에 삽입해야합니다. 수만, 수만, 수만 명, 심지어 수만 명도 있습니다. 이 크기의 데이터를 삽입하기 위해 최대 절전 모드를 사용하는 경우 예외가 발생할 수 있습니다. 일반적인 예외는 OutOfMemoryError (메모리 오버플로 예외)입니다.
먼저 최대 절전 모드 삽입 작업 메커니즘을 간단히 검토해 봅시다. 최대 절전 모드는 내부 캐시를 유지해야합니다. 삽입 작업을 수행하면 모든 객체를 관리를 위해 내부 캐시에서 작동하도록합니다.
최대 절전 모드의 캐시와 관련하여 최대 절전 모드에는 내부 캐시 및 보조 캐시 이론이 있습니다. 최대 절전 모드는이 두 캐시에 대해 다른 관리 메커니즘을 가지고 있으므로 보조 캐시와 관련하여 크기를 구성 할 수 있으며 내부 캐시의 경우 최대 절전 모드는 "가죽 끈 스트리밍"태도를 채택하며 용량에는 제한이 없습니다. 이제 문제의 요점이 발견됩니다. 거대한 데이터를 삽입하면 내부 캐시에 많은 객체가 포함됩니다 (내부 캐시는 메모리에 캐시 됨) 시스템 메모리가 비트 단위로 섭취됩니다. 시스템이 마침내 "튀김"되면 합리적입니다.
이 문제를 더 잘 처리하는 방법에 대해 생각해 봅시다. 일부 개발 조건은 최대 절전 모드를 사용하여 처리해야하며 물론 일부 프로젝트는 더 유연하며 다른 방법을 찾을 수 있습니다.
여기서는 두 가지 방법을 권장합니다.
(1) : 최대 절전 모드를 최적화하고 세그먼트 삽입 방법을 사용하여 프로그램에서 캐시를 시간에 제거하십시오.
(2) : 최대 절전 모드 API를 우회하고 JDBC API를 통해 직접 배치 삽입을 수행하십시오. 이 방법은 최고의 성능과 가장 빠릅니다.
위의 방법 1의 경우, 기본 아이디어는 다음과 같습니다. 최대 최적화, Hibernate.jdbc.batch_size 매개 변수를 구성 파일에 설정하여 매번 제출 된 SQL 수를 지정합니다. 이 프로그램은 세그먼트 삽입에서 시간에 캐시를 지우는 방법을 사용합니다 (세션은 비동기식 쓰기-비인을 구현합니다.
Hibernate.jdbc.batch_size 매개 변수를 설정하려면 다음 구성을 참조하십시오.
<hibernate-configuration> <session-factory>… <property name = "hibernate.jdbc.batch_size"> 50 </property>… <session-factory> <hibernate-configuration>
hibernate.jdbc.batch_size 매개 변수를 구성하는 이유는 데이터베이스를 가능한 한 적게 읽는 것입니다. hibernate.jdbc.batch_size 매개 변수의 값이 클수록 데이터베이스를 읽는 시간이 적고 속도가 빨라집니다. 위의 구성으로부터, 프로그램이 50 SQL을 축적하기 전에 배치로 제출할 때까지 최대 절전 모드가 대기한다는 것을 알 수 있습니다.
저자는 또한 Hibernate.jdbc.batch_size 매개 변수의 값이 가능한 한 크지 않을 수 있으며 성능 관점에서 논의되어야한다고 생각하고 있습니다. 이를 위해서는 실제 상황을 고려하고 적절하게 설정해야합니다. 일반적으로 30 또는 50을 설정하면 요구 사항을 충족 할 수 있습니다.
프로그램 구현 측면에서 저자는 예를 들어 10,000 조각의 데이터를 삽입합니다.
세션 세션 = hibernateutil.currentsession (); transatcion tx = session.begintransaction (); for (int i = 0; i <10000; i ++) {Student st = new Student (); St.SetName ( "Feifei"); Session.Save (i%50 == 0) // 세션 {session {flush (); // 데이터베이스 데이터 세션과 동기를 유지합니다 .Clear (); // 내부적으로 캐시 된 모든 데이터를 지우고 점유 된 메모리를 시간에 해제}} tx.commit (); ...특정 데이터 척도 에서이 접근 방식은 시스템 메모리 리소스를 비교적 안정적인 범위로 유지할 수 있습니다.
참고 : 앞에서 언급 한 두 번째 수준 캐시는 여기에서 언급해야합니다. 보조 캐시가 활성화되면 보조 캐시를 유지하기 위해 최대 절전 모드는 삽입, 업데이트 및 작업을 삭제할 때 해당 데이터를 보조 캐시에 충전합니다. 성능이 크게 손실되므로 저자는 배치 처리에서 레벨 2 캐시를 비활성화하는 것이 좋습니다.
방법 2의 경우, 기존의 JDBC 배치 처리가 사용되며 JDBC API는이를 처리하는 데 사용됩니다.
Java Batch Processing 및 Self-Execution SQL을 참조하십시오.
위의 코드를 살펴보면 항상 무언가가 부적절하다고 생각하십니까? 예, 당신은 그것을 알아 차리지 못했습니다! 이것은 여전히 최대 절전 모드 맛이없는 JDBC의 전통적인 프로그래밍입니다.
위의 코드는 다음으로 수정할 수 있습니다.
트랜잭션 tx = session.begintransaction (); // 최대 절전 모드 트랜잭션 처리 연결 연결 Conn = Session.Connection (); 준비 STMT = CONN.PREPARESTATEMENT ( "t_student (이름) 값 (?)에 삽입"); for (int j = 0; j ++; j <200) {for (int i = 0; i ++; j <50) {stmt.setString (1, "feifei");}} stmt.executeUpdate (); tx.commit (); // 최대 절전 모드 트랜잭션 처리 경계 사용 ...이 변화는 최대 절전 모드 맛을 가질 것입니다. 테스트 후, 저자는 배치 처리를 위해 JDBC API를 사용하며, 이는 최대 절전 모드 API를 사용하는 것보다 성능이 거의 10 배 더 높습니다. 이것은 의심 할 여지없이 JDBC의 지배적 인 성능입니다.
Batch Update 및 Hibernate2의 삭제에서 배치 업데이트 작업을 위해 Hibernate는 요구 사항을 충족 한 데이터를 찾은 다음 업데이트 작업을 수행합니다. 배치 삭제에 대해서도 마찬가지입니다. 먼저 조건을 충족하는 데이터를 찾은 다음 삭제 작업을 수행하십시오.
이것은 두 가지 주요 단점이 있습니다.
(1) : 많은 기억을 취합니다.
(2) : 대규모 데이터를 처리 할 때 업데이트/삭제 명령문을 실행하는 것은 막대한 금액이며 업데이트/삭제 명령문은 하나의 객체 만 작동 할 수 있습니다. 데이터베이스가 자주 작동하면 데이터베이스의 성능이 낮다는 것은 상상할 수 있습니다.
Hibernate3이 출시 된 후 배치 업데이트/삭제 작업을 위해 대량 업데이트/삭제가 도입되었습니다. 원칙은 JDBC의 배치 업데이트/삭제 작업과 매우 유사한 HQL 문을 통해 배치 업데이트/삭제 작업을 완료하는 것입니다. 성능 측면에서, hibernate2의 배치 업데이트/삭제에 비해 크게 개선된다.
트랜잭션 tx = session.beginsession (); String HQL = "삭제 학생"; Query Query = session.createquery (HQL); int size = query.executeUpdate (); tx.commit (); ...
콘솔은 하나의 삭제 명령문 동 최대 절전 모드 : t_student에서 삭제됩니다. 명세서 실행은 적으며 성능은 JDBC를 사용하는 것과 거의 동일합니다. 성능을 향상시키는 좋은 방법입니다. 물론, 더 나은 성능을 얻으려면 저자는 배치 업데이트 및 삭제 작업이 여전히 JDBC를 사용하도록 권장합니다. 방법과 기본 지식 포인트는 기본적으로 위의 배치 삽입 방법 2와 동일하므로 여기에서는 중복되지 않습니다.
여기서는 데이터베이스 측면에서 성능 향상을 고려하고 최대 절전 모드 프로그램 측면에서 통화 저장 절차를 고려하는 또 다른 방법을 제공합니다. 저장된 절차는 데이터베이스 쪽에서 더 빠르게 실행됩니다. 배치 업데이트를 예로 들어 참조 코드가 제공됩니다.
먼저 데이터베이스 측면에서 BatchupDatestudent라는 저장된 절차를 만듭니다.
생산을 만들거나 교체하십시오. Batchupdatestudent (a 번호) Asbeginupdate 학생 세트 연령 = 연령+1 Age> A; end;
통화 코드는 다음과 같습니다.
트랜잭션 tx = session.beginsession (); Connection Conn = Session.Connection (); String PD = "… {Call BatchUpDatestudent (?)}"; CallAbleStement CSTMT = Conn.PrepareCall (PD); CSTMT.SetInt (1, 20); // 연령 매개 변수를 20tx.commit ()로 설정합니다.위의 코드를 관찰하면 최대 절전 모드 API를 우회하고 JDBC API를 사용하여 저장된 절차를 호출하고 최대 절전 모드의 트랜잭션 경계를 사용합니다. 저장된 절차는 의심 할 여지없이 배치 처리 성능을 향상시키는 좋은 방법입니다. 그들은 데이터베이스쪽으로 직접 실행되며 어느 정도까지 배치 처리 압력을 데이터베이스로 전송합니다.
추신
이 기사에서는 Hibernate의 배치 처리 작업에 대해 설명하고 시작점은 성능 향상을 고려하는 것이며 성능 향상의 작은 측면 만 제공합니다.
어떤 방법을 채택하든 실제 조건에 따라 고려해야합니다. 사용자에게 자신의 요구를 충족시키는 효율적이고 안정적인 시스템을 제공하는 것이 최우선 과제입니다.
이 기사가 모든 사람의 최대 절전 모드 프로그래밍에 도움이되기를 바랍니다.