我想从我的Java程序中的Oracle 10g中读取数据,其中一列是CLOB类型,如下所示(注意:数据是CLOB类型的列):从Oracle 10g获取Clob导致高CPU使用率
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问题。我应该如何解决这个问题?提前致谢!
你能定义“大热门”吗?你在说毫秒吗?秒?分钟?你说它正在产生大量的CPU使用率。那是在数据库服务器上吗?或者在应用程序服务器上?然后你说这看起来像是一个I/O问题。你如何从CPU问题到I/O问题?如果这是一个I/O问题,那么当分析代码时,您会发现很多I/O等待,而不是很多CPU等待。 –
读取CLOB数据需要几秒钟的时间。在阅读过程中,CPU使用率达到50%左右。当我用java分析器检查它时,大部分cpu时间都花在java.net.SocketInputStream.read()上。 – user1985101
我猜你所说的CPU峰值位于应用程序服务器上,对吗?如果通过网络从数据库服务器向应用程序服务器推送44 MB数据,则几秒钟内似乎很合理。假设网络上没有其他流量,那么通过100baseT以太网网络传输大量数据需要4秒多一点的时间。所以你使用一半的CPU来跟上网卡的事实对我来说似乎很合理。是否有理由希望能够更快地传输数据? –