/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.test.performance.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.jdbc.WorkExecutor;
import org.hibernate.jdbc.WorkExecutorVisitable;
/**
* @author Tomas Hradec
*/
public class BatchSupport {
private static final long batchSize = 1000;
private final SessionFactory sf;
private final long initialOffset;
public BatchSupport(SessionFactory sf, long initialOffset) {
this.sf = sf;
this.initialOffset = initialOffset;
}
public void execute(final String sql, long totalCount, final BatchCallback batchCallback) {
Session s = sf.openSession();
try {
long iterationCount = totalCount / batchSize;
if ( iterationCount == 0 ) {
iterationCount = 1;
}
for ( long iterationIndex = 0; iterationIndex < iterationCount; iterationIndex++ ) {
final long idOffset = initialOffset + ( iterationIndex * batchSize );
final long idCount = initialOffset + ( iterationIndex * batchSize ) + batchSize - 1;
final SessionImplementor session = (SessionImplementor) s;
session.getTransactionCoordinator().createIsolationDelegate().delegateWork(
new WorkExecutorVisitable() {
@Override
public Object accept(WorkExecutor executor, Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement( sql );
for ( long id = idOffset; id < idCount; id++ ) {
batchCallback.initStatement( ps, id );
ps.addBatch();
}
ps.executeBatch();
ps.close();
return null;
}
}, true );
}
}
finally {
s.close();
}
}
}