我有一个在WildFly 9服务器上运行的Java EE程序。在这个程序中,我想在数据库中记录一次数千条记录。这就是为什么在我的方法中我使用原生查询:
public int record(Collection<MyEntity> entities) {
/**
* Following query is something like:
* INSERT INTO my_table (id, date, value) VALUES
* (1, '2016-02-24', 10),
* (2, '2016-02-23', 8),
* ...
* (10000, '2016-02-01', 6);
*/
StringBuilder queryString = new StringBuilder("INSERT INTO my_table (id, date, value) VALUES ");
for (int i = 1; i <= entities.size(); i++) {
queryString.append("?,?,?)");
if (i < parameters.size()) {
queryString.append(',');
}
}
Query query = getEntityManager().createNativeQuery(queryString.toString());
int parameterPosition = 0;
for (MyEntity entity : entities) {
query.setParameter(++parameterPosition, entity.getId());
query.setParameter(++parameterPosition, entity.getDate());
query.setParameter(++parameterPosition, entity.getValue());
}
return query.executeUpdate();
}
我的问题是Hibernate
在缓存中保留了一些(我不知道有多少)预处理语句。例如,如果我的集合中有一个实体,则将缓存查询INSERT INTO my_table (id, date, value) VALUE (?,?,?)
,对于两个实体,它将为INSERT INTO my_table (id, date, value) VALUE (?,?,?),(?,?,?)
,依此类推。正如我所说,我想记录成千上万的记录,所以大字符串被缓存,过了一段时间我的应用程序因丑陋的java heap space
错误而崩溃。
所以我想知道是否可以为此特定查询禁用缓存?