从Oracle 10g获取Clob会导致高CPU使用率

时间:2013-01-16 21:05:42

标签: performance oracle spring jdbc clob

我正在尝试从我的Java程序中读取Oracle 10g中的数据,其中一列是CLOB类型,如下所示(注意:数据是CLOB类型的列):

private final static String LOAD_QUERY 
        = "SELECT id, data FROM table WHERE id = ?";

    public SomeObject loadById(long id){
        SomeObject obj = null;
        try {
            obj = jdbcTemplate.queryForObject(LOAD_QUERY,
                    new ParameterizedRowMapper<SomeObject>() {
                public Model mapRow(ResultSet rs, int rowNum) throws SQLException {
                    long id = rs.getLong("id");
                    String data = rs.getString("data");
                    return new SomeObject(id, data);
                }
            }, id);
        } catch (Exception e) {
            throw new SomeException("Error during SQL query", ErrorCode.INTERNAL_ERROR, e);
        }
        return obj;
    }

存储在CLOB中的数据大小高达44Mb。我能够成功检索CLOB值,但它对cpu的使用是一个很大的打击。在使用Java VisualVM运行探查器之后,它似乎是一个IO问题。我该如何解决这个问题?提前谢谢!

1 个答案:

答案 0 :(得分:0)

如果它是一个大的clob,我建议尝试通过流检索内容。 通过使用getString,将分配一个大型数组,也可能是由二级缓存分配的大型数组,甚至可以分配多个数组,而值是通过底层框架的不同层复制的值。 所有这些字符串分配和复制都会导致CPU使用率过高。