Я запускаю запросы против Oracle 10g с помощью JDBC (используя последние версии драйверов и UCP в качестве DataSource), чтобы получить CLOB (около 20 тыс. Символов). Однако производительность кажется довольно плохим: пакетное извлечение 100 LOB занимает в среднем 4 секунды. Операция также не связана ни с I/O, ни с процессором, ни с сетью, судя по моим наблюдениям.Производительность Oracle CLOB
Моя тестовая установка выглядит следующим образом:
PoolDataSource dataSource = PoolDataSourceFactory.getPoolDataSource();
dataSource.setConnectionFactoryClassName("...");
dataSource.setConnectionPoolName("...");
dataSource.setURL("...");
dataSource.setUser("...");
dataSource.setPassword("...");
dataSource.setConnectionProperty("defaultRowPrefetch", "1000");
dataSource.setConnectionProperty("defaultLobPrefetchSize", "500000");
final LobHandler handler = new OracleLobHandler();
JdbcTemplate j = new JdbcTemplate(dataSource);
j.query("SELECT bigClob FROM ...",
new RowCallbackHandler() {
public void processRow(final ResultSet rs) throws SQLException {
String result = handler.getClobAsString(rs, "bigClob");
}
});
}
Я экспериментировал с извлекающих размеров, но безрезультатно. Я делаю что-то неправильно? Есть ли способ ускорить извлечение CLOB при использовании JDBC?
Как вы определили, что сеть не связана? Вы говорите о настройке нового JDBC-соединения (дорогого), данных на 2 Мб для чтения с диска, отправки его по сети и накладных расходов на запрос (который не указан). Я не знаю, все ли это 4s, в зависимости от вашего макета сети и настройки базы данных. – Gandalf
Уточнение: я измеряю в * единицах * 100, поэтому первоначальный штраф за соединение не учитывается. Суммарная пропускная способность сети составляет менее 2 Мбит/с, поэтому я полагаю, что она не связана с сетью. – yawn
Сколько времени занимает фактический запрос? – Gandalf