De vanliga sätten att ställa in radhämtningsstorlek är:
- Via
java.sql.Connectionleverantörsimplementeringsklass anpassad metod (t.ex.OracleConnection.setDefaultRowPrefetch) - Via
java.sql.Statement.setFetchSize(int):ger en ledtråd till föraren om radhämtningsstorleken för allaResultSetshämtat från dettaStatement. Denna metod ärvs avPreparedStatementochCallableStatement. De flesta JDBC-drivrutiner stöder det. - Via
java.sql.ResultSet.setFetchSize(int):ger en ledtråd till föraren om radhämtningsstorleken för all dennaResultSet.
MS SQL Server JDBC-drivrutinen stöder inte något av dessa sätt:
- MSSQL-drivrutinen har ingen sådan metod.
- Tyvärr, medan de flesta förare respekterar tipset, gör inte MSSQL-drivrutinen det. Så inte användbart för dig. Se Vad fungerar Statement.setFetchSize(nSize)-metoden egentligen göra i SQL Server JDBC-drivrutinen?
- Samma problem som
Statement.
Som standard hämtar den alla raderna från databasen om du inte anger markörtyp i JDBC-drivrutinen. MSSQL-drivrutinen kan inte direkt styra hämtningsstorleken med de vanliga metoderna.
Lösningar:
- Casta ditt
StatementtillSQLServerStatementoch använd metodensetMaxRows(int). Varför de inte implementerade detta inom standardmetoden Steve Ballmer bara vet;^) - Skapa din drivrutin med en markörtyp. Standard hämtningsstorlek för en markör är 1. Ställ in
ConnectionsträngegenskapselectMethod=cursor. Alternativt kan du skapaStatementmedcom.microsoft.sqlserver.jdbc.SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLYrullning för framåtriktad, skrivskyddad åtkomst och använd sedansetFetchSizemetod för att justera prestanda. https://technet.microsoft.com/en -us/library/aa342344%28SQL.90%29.aspx - Använd (proprietär) SQL för att begränsa antalet returnerade rader (inte samma sak som att ställa in hämtningsstorleken ):
SET ROWCOUNTellerSELECT TOP N - Byt till jTDS med öppen källkod drivrutin, speciellt framtagen för att övervinna problemen med SQL Server-drivrutinen. Det är en överlägsen förare.