禁用JPA查询缓存

时间:2016-02-24 19:59:47

标签: java hibernate jpa caching

我有一个在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错误而崩溃。

所以我想知道是否可以为此特定查询禁用缓存?

0 个答案:

没有答案