De vanliga sätten att ställa in radhämtningsstorlek är:
- Via
java.sql.Connection
leverantö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 allaResultSets
hämtat från dettaStatement
. Denna metod ärvs avPreparedStatement
ochCallableStatement
. 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
Statement
tillSQLServerStatement
och 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
Connection
strängegenskapselectMethod=cursor
. Alternativt kan du skapaStatement
medcom.microsoft.sqlserver.jdbc.SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY
rullning för framåtriktad, skrivskyddad åtkomst och använd sedansetFetchSize
metod för att justera prestanda. http://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 ROWCOUNT
ellerSELECT 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.