Den adaptive buffering er et godt svar. Jeg vil også anbefale at tjekke forbindelsernes SET
muligheder via SQL Server Profiler.
Når du starter en sporing, skal du sørge for ExistingConnections
er valgt. Sammenlign en SPID fra en JDBC-forbindelse og en SSMS-forbindelse. ARITHABORT
kommer til at tænke på som en, som jeg har set forårsage en forskel i ydeevne mellem SSMS og JDBC driver. Microsoft nævner det kort her:http://msdn.microsoft.com/en-us/library/ms190306.aspx. Stack Exchange-oplysninger her:https://dba.stackexchange.com/questions/9840/why-would-set-arithabort-on-dramatically-speed-up-a-query
På Oracle har jeg set enorme konsekvenser ved at spille med setFetchSize
metode på Statement
/ PreparedStatement
objekt. Tilsyneladende understøtter SQL Server-driveren ikke denne metode. Der er dog en intern metode i driveren til det. Se Angiv en standardrækkeforhåndshentning i SQL Server ved hjælp af JDBC-driver for detaljer.
Hvad laver du også i din while (rs.next())
sløjfe? Prøv ikke at gøre andet end at læse en kolonne, såsom rs.getInt(1)
. Se hvad der sker. Hvis det flyver, tyder det på, at flaskehalsen er i din tidligere behandling af resultatsættet. Hvis det stadig er langsomt, så skal problemet være i driveren eller databasen.
Du kan bruge SQL Server Profiler til at sammenligne udførelserne, når de kommer ind via JDBC, og når du kører det via SSMS. Sammenlign CPU, læsninger, skrivninger og varighed. Hvis de er forskellige, så er udførelsesplanen sandsynligvis anderledes, hvilket peger mig tilbage til det første, jeg nævnte:SET
muligheder.