De adaptieve buffering is een goed antwoord. Ik zou ook aanraden de verbindingen te controleren' SET
opties via SQL Server Profiler.
Wanneer u een tracering start, zorg er dan voor dat ExistingConnections
is geselecteerd. Vergelijk een SPID van een JDBC-verbinding en een SSMS-verbinding. ARITHABORT
komt in me op als een die ik heb gezien die een verschil in prestatie veroorzaakt tussen SSMS en JDBC-stuurprogramma. Microsoft noemt het hier kort:http://msdn.microsoft.com/en-us/library/ms190306.aspx. Stack Exchange-informatie hier:https://dba.stackexchange.com/questions/9840/why-would-set-arithabort-on-dramatically-speed-up-a-query
Op Oracle heb ik enorme effecten gezien door te spelen met de setFetchSize
methode op de Statement
/ PreparedStatement
voorwerp. Blijkbaar ondersteunt het SQL Server-stuurprogramma die methode niet. Er is echter een interne methode in de driver voor. Zie Een standaard rij-prefetch instellen in SQL Server met JDBC-stuurprogramma voor details.
En wat doe je in je while (rs.next())
lus? Probeer niets anders te doen dan een kolom te lezen, zoals rs.getInt(1)
. Kijken wat er gebeurt. Als het vliegt, suggereert dat het knelpunt in uw eerdere verwerking van de resultatenset. Als het nog steeds traag is, moet het probleem in het stuurprogramma of de database zitten.
U kunt SQL Server Profiler gebruiken om de uitvoeringen te vergelijken zoals ze binnenkomen via JDBC en terwijl u deze uitvoert via SSMS. Vergelijk de CPU, leest, schrijft en duur. Als ze anders zijn, dan is het uitvoeringsplan waarschijnlijk anders, wat me terugverwijst naar het eerste dat ik noemde:de SET
opties.