Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O que o método Statement.setFetchSize(nSize) realmente faz no driver JDBC do SQL Server?


Em JDBC, o setFetchSize(int) O método é muito importante para o desempenho e gerenciamento de memória na JVM, pois controla o número de chamadas de rede da JVM para o banco de dados e, correspondentemente, a quantidade de RAM usada para o processamento do ResultSet.

Inerentemente, se setFetchSize(10) está sendo chamado e o driver está ignorando, provavelmente há apenas duas opções:
  1. Tente um driver JDBC diferente que respeite a dica de tamanho de busca.
  2. Veja as propriedades específicas do driver na conexão (URL e/ou mapa de propriedades ao criar a instância de conexão).

O RESULT-SET é o número de linhas empacotadas no banco de dados em resposta à consulta. chamadas e a RAM resultante necessária para o processamento depende da configuração do tamanho da busca.

Portanto, se RESULT-SET tiver 100 linhas e o tamanho de busca for 10, haverá 10 chamadas de rede para recuperar todos os dados, usando aproximadamente 10*{row-content-size} RAM a qualquer momento.

O tamanho de busca padrão é 10, o que é bastante pequeno. No caso postado, parece que o driver está ignorando a configuração de tamanho de busca, recuperando todos os dados em uma chamada (grande requisito de RAM, chamadas de rede mínimas ideais).

O que acontece abaixo de ResultSet.next() é que ele não busca uma linha por vez do RESULT-SET. Ele busca isso do ROW-SET (local) e busca o próximo ROW-SET (invisivelmente) do servidor à medida que ele se esgota no cliente local.

Tudo isso depende do driver, pois a configuração é apenas uma 'dica', mas na prática descobri que é assim que funciona para muitos drivers e bancos de dados (verificados em muitas versões do Oracle, DB2 e MySQL).