Любое решение проблемы неэффективности Oracle TNS (много обращений и задержек) из приложения Java?

Я смотрел на очень медленный SQL-запрос (исходящий из приложения Java, использующего Hibernate, развернутый в JBoss 5.1). Этот конкретный запрос вернул около 10 тыс. Записей, но все равно занял 40 или более секунд.

В итоге я прослушал трафик с базой данных (у wirehark есть диссектор для TNS) и нашел кое-что неожиданное. Когда данные приходили с сервера, каждая строка результатов находилась в своем собственном пакете TNS. Кроме того, каждый пакет TNS подтверждался клиентом (т. Е. Сервером приложений) до того, как следующий был отправлен из базы данных. Для записей размером 10К требуется 10 тыс. Циклов приема-передачи для получения пакета и его подтверждения. Влияние на производительность огромно.

Это ужасно неэффективно. TCP позволяет пакеты большего размера и имеет ряд механизмов (скользящие окна, отложенные ACK) для уменьшения задержки и увеличения пропускной способности. Однако в этом случае протокол TNS наверху добавляет собственное согласование.

Если я запускаю тот же запрос из Oracle SQL Developer, я не вижу этого шаблона. Запрос выполняется примерно за 1/10 времени без тысяч циклических обращений.

Краткая версия : Проводной протокол Oracle (TNS), кажется, передает данные в одном пакете TNS на строку результата запроса и требует, чтобы каждый пакет подтверждался клиентом, прежде чем сервер отправит следующий.

I ' Мы нашли информацию об этом [здесь] [1] (прокрутите вниз до раздела «Параметры SDU и TDU в файле tnsnames.ora»).

Итак, мой вопрос: можно ли управлять поведением драйвера Oracle (я использую 10.2.0.4.0), чтобы протокол TNS был более эффективным? Очередной раз, это довольно стандартное приложение J2EE, развернутое в JBoss.

Большое спасибо!

6
задан wishihadabettername 8 October 2010 в 20:04
поделиться