我想從我的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來跟上網卡的事實對我來說似乎很合理。是否有理由希望能夠更快地傳輸數據? –