Адаптивното буфериране е добър отговор. Бих препоръчал също да проверите SET на връзките опции чрез SQL Server Profiler.
Когато стартирате проследяване, уверете се, че ExistingConnections е избран. Сравнете SPID от JDBC връзка и SSMS връзка. ARITHABORT идва на ум като такъв, който видях да причинява разлика в производителността между SSMS и JDBC драйвер. Microsoft го споменава накратко тук:https://msdn.microsoft.com/en-us/library/ms190306.aspx. Информация за Stack Exchange тук:https://dba.stackexchange.com/questions/9840/why-would-set-arithabort-on-dramatically-speed-up-a-query
В Oracle видях огромно въздействие, като играя с setFetchSize метод на Statement / PreparedStatement обект. Очевидно драйверът на SQL Server не поддържа този метод. Въпреки това, има вътрешен метод в драйвера за това. Вижте Задаване на предварително извличане на ред по подразбиране в SQL Server с помощта на JDBC драйвер за подробности.
Също така, какво правите във вашия while (rs.next()) цикъл? Опитайте да не правите нищо друго, освен да четете колона, като rs.getInt(1) . Вижте какво се случва. Ако лети, това предполага, че тесното място е в предишната ви обработка на набора от резултати. Ако все още е бавен, проблемът трябва да е в драйвера или базата данни.
Можете да използвате SQL Server Profiler, за да сравните изпълненията, когато идват чрез JDBC и докато го изпълнявате чрез SSMS. Сравнете CPU, четене, запис и продължителност. Ако са различни, тогава планът за изпълнение вероятно е различен, което ме насочва към първото нещо, което споменах:SET опции.