최대 절전 모드 - 배치 삽입이 실제로 수행되는지 확인하는 방법
기술 스택:Oracle 데이터베이스 11.2.0.2, Java 1.6, 최대 절전 모드 3.6.6.6.최종.
저는 겨울잠을 자는 것이 처음입니다, 사소한 일이라면 사과드립니다.
다음 코드는 약간의 최적화를 제공하기로 되어 있었습니다.
Transaction tx = session.beginTransaction();
for (int i = 0; i < 10; i++) {
POJO pojo = new POJO(i);
session.save(pojo);
}
tx.commit();
hibernate.cfg.xml
다음 항목이 있습니다.
<property name="jdbc.batch_size">500</property>
휴면 상태가 정말로 이 모든 삽입물을 일괄 처리하는지 어떻게 확인할 수 있습니까?10개의 삽입을 수행하면 이득이 없습니다.한 가지 아이디어는 jdbc 일반 쿼리를 바로 뒤에 놓는 것입니다.save()
레코드가 DB에 추가되었는지 확인합니다.
String query = "retrieve previously added element"
PreparedStatement stmt = session.connection().prepareStatement(query.toString());
Result rs = statement.executeQuery();
/** check contents of rs */
이 경우 이전에 추가된 요소가 있는 비어 있지 않은 집합을 반환합니다.무슨 의미가 있습니까?다른 방법으로 배치가 작동하는지 확인할 수 있습니다.
잘 부탁드립니다.
로깅 공급자에 "BatchingBatch" 로거를 추가해야 합니다.
org.hibernate.engine.jdbc.batch.internal.BatchingBatch
그러면 로그에서 다음과 같은 내용을 확인할 수 있습니다.
2018-02-20 17:33:41.279 DEBUG 6280 --- [ main] o.h.e.jdbc.batch.internal.BatchingBatch : Executing batch size: 19
이 메시지가 표시되지 않으면 배치가 작동하지 않습니다.
최대 절전 모드 버전 5.2.12로 테스트됨
실제로 데이터베이스로 플러시된 항목을 확인하려면 다음과 같이 로깅 속성을 구성합니다.
log4j.rootLogger=info, stdout
# basic log level for all messages
log4j.logger.org.hibernate=debug
# SQL statements and parameters
log4j.logger.org.hibernate.SQL=debug
log4j.logger.org.hibernate.type.descriptor.sql=trace
hibernate.cfg.xml에 추가합니다.
<property name="show_sql">true</property>
그러면 실제로 DB로 전송된 내용을 확인할 수 있습니다.
배치의 경우 다음과 같은 출력이 있어야 합니다.
insert into Pojo (id , titel) values (1, 'val1') , (2, 'val2') ,(3, 'val3')
또한 배치 처리를 가장 효율적으로 활용하는 방법에 대한 팁을 제공하는 좋은 게시물이 있습니다. 기사
예를 들어 ${jdbc.batch_size}을(를) 저장할 때마다 플러시를 고려할 수 있습니다.
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
Cart cart = new Cart(...);
customer.setCart(cart) // note we are adding the cart to the customer, so this object
// needs to be persisted as well
session.save(customer);
if ( i % 20 == 0 ) { //20, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
spring boot application.yml 배치가 작동하는지 확인하기 위해 아래 행을 추가했습니다.
logging:
level:
org.hibernate:
engine.jdbc.batch.internal.BatchingBatch: DEBUG
결과적으로 로그에 해당 행이 표시됩니다.
org.jboss.logging.DelegatingBasicLogger: Executing batch size: 30
언급URL : https://stackoverflow.com/questions/42002249/hibernate-how-to-verify-if-batch-insert-is-really-performed
'source' 카테고리의 다른 글
참조가 아닌 새로운 변수로 자바스크립트 객체를 복사하는 방법은 무엇입니까? (0) | 2023.07.26 |
---|---|
mysql 각 데이터 행의 마지막 N자를 다음 행으로 이동합니다. (0) | 2023.07.26 |
routerLink 속성을 조건부로 비활성화하려면 어떻게 해야 합니까? (0) | 2023.07.26 |
레이저 기반 MVC 대 MVC의 단일 페이지 애플리케이션 4. (0) | 2023.07.26 |
Oracle Java ConcurrentHashMap의 잘못된 구현? (0) | 2023.07.26 |