Tin*_*iny 3 hibernate batch-file batch-processing
我在我的DAO类中使用以下事务代码单元在Hibernate中插入多行.
@Override
@SuppressWarnings("unchecked")
@Transactional(readOnly = false, propagation=Propagation.REQUIRES_NEW, rollbackFor={Throwable.class})
public String insertZoneCharge(Long zoneId, List<Object[]> items)
{
Session session=sessionFactory.openSession();
session.beginTransaction();
//Configuration configuration=new Configuration();
//configuration.setProperty("hibernate.jdbc.batch_size", "50");
int i=1;
for(Object[] o:items)
{
if(o[2]!=null&&StringUtils.isNotBlank(o[2].toString()))
{
ZoneChargePK zoneChargeId=new ZoneChargePK();
zoneChargeId.setWeightId(Long.parseLong(o[0].toString()));
zoneChargeId.setZoneId(zoneId);
model.ZoneCharge zoneCharge=new model.ZoneCharge();
zoneCharge.setZoneChargePK(zoneChargeId);
zoneCharge.setCharge(new BigDecimal(o[2].toString()).setScale(2, RoundingMode.HALF_UP));
session.save(zoneCharge);
if(++i%50==0)
{
session.flush();
session.clear();
}
}
}
session.getTransaction().commit();
session.close();
return "Data saved successfully.";
}
Run Code Online (Sandbox Code Playgroud)
此方法的参数通过JSON请求提供.我不会深入了解Oracle表的详细信息,因为它不相关.
当我提供让我们说3个值时,这个循环被迭代三次并且在相应的数据库表中创建了三行.成功完成事务后,INSERT我在控制台上看到的以下本机Oracle 语句似乎被执行了三次.
insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
Run Code Online (Sandbox Code Playgroud)
调试和跟踪信息如下.
DEBUG [http-apr-8080-exec-84] (SqlStatementLogger.java:104) - insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [1] as [NUMERIC] - 1.00
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [2] as [BIGINT] - 164
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [3] as [BIGINT] - 22
DEBUG [http-apr-8080-exec-84] (SqlStatementLogger.java:104) - insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [1] as [NUMERIC] - 2.00
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [2] as [BIGINT] - 221
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [3] as [BIGINT] - 22
DEBUG [http-apr-8080-exec-84] (SqlStatementLogger.java:104) - insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [1] as [NUMERIC] - 3.00
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [2] as [BIGINT] - 163
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [3] as [BIGINT] - 22
Run Code Online (Sandbox Code Playgroud)
因此,似乎INSERT已经执行了三个单独的语句,并且已经进行了三次单独的数据库访问.
我希望它INSERT在一次旅行中只执行一个多行语句.在这种情况下,Hibernate是否真的执行了三个单独的语句?如果是,那么在特定批次中执行语句的方式是什么?我的代码有什么问题吗?
我的Hibernate配置application-context.xml如下.
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.jdbc.batch_size=50
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.format_sql=false
hibernate.show_sql=true
hibernate.order_updates=true
hibernate.connection.autocommit=false
hibernate.order_inserts=true
hibernate.order_updates=true
hibernate.cache.use_query_cache=false
hibernate.cache.use_second_level_cache=false
javax.persistence.validation.mode=callback
</value>
</property>
Run Code Online (Sandbox Code Playgroud)
你的期望是错误的.Hibernate不会生成单个insert语句.但它会为批处理添加三个插入语句并执行此批处理,从而对数据库进行单次往返.
有关JDBC批处理更新的更多信息,请阅读http://docs.oracle.com/javase/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html.
| 归档时间: |
|
| 查看次数: |
9609 次 |
| 最近记录: |