Столкнулся с очень странной проблемой, раньше такого не встречал.
Дано:
Java-приложение запущенное локально, Oracle DB на удаленном сервере. Скорость соединения между ними - 2.5MB/s.
В приложении выполняем очень простой запрос вида «select id, name from table_name», запрос возвращает ~60K строк, общий размер данных - 1,5 Мб, время выполнения - 80 сек. Профайлер говорит, что всё это время приложение висит в методе oracle.net.Packet.receive.
Ок, открываем SQL Developer, выполняем тот же самый запрос - 0,6 сек/5000 строк, т.е. примерно 7-8 секунд на всю выборку. Повторяем то же самое в DBeaver - 7 сек/5000 строк или 80 сек, если убрать ограничение на размер выборки.
Какая-то нездоровая фигня получается. Берем в руки tcpdump и смотрим, как передаются данные от базы к нам. В случае Java-приложения и DBeaver данные передаются в пакетах размером ~200 байт, SQLDeveloper получает данные в пакетах ~2000 байт.
Ладно, лезем в официальную доку https://docs.oracle.com/cd/E18283_01/network.112/e10836/performance.htm#i1006332, находим что нам надо поднять размер SDU/TDU. На стороне базы я не могу ничего менять, таково требование заказчика. Пробуем добавить эти параметры на стороне клиента, получается вот такой URL:
jdbc:oracle:thin:@(DESCRIPTION=(SDU=11280)(TDU=11280)(ADDRESS=(PROTOCOL=tcp)(HOST=<host>)(PORT=1521)(SEND_BUF_SIZE=11784)(RECV_BUF_SIZE=11784))(CONNECT_DATA=(SERVICE_NAME=<db>)))