JDBC - performance

6 respostas
kadekdu

Dado os códigos:

String query SELECT COF_NAME, PRICE FROM COFFEES; 
ResultSet rs = stmt.executeQuery(query); 
while (rs.next()) { 
	String s = rs.getString("COF_NAME"); 
	float n = rs.getFloat("PRICE"); 
	System.out.println(s + + n); 
}

e

String query SELECT COF_NAME, PRICE FROM COFFEES; 
ResultSet rs = stmt.executeQuery(query); 
while (rs.next()) { 
	String s = rs.getString(1); 
	float n = rs.getFloat(2); 
	System.out.println(s + + n); 
}

Gostaria de saber a diferença entre usar um getString passando o índice e passando o nome da coluna.
Na verdade eles trazem o mesmo resultado… mas queria saber em termos de performance.
Penso eu que passando o numero da coluna ele busca pelo índice direto, passando o nome da coluna ele compara coluna por coluna até achar a correta.
Estou certo no pensamento??

valeu
Abraços
kdu

6 Respostas

ddduran

http://java.sun.com/j2se/1.5.0/docs/api/java/sql/ResultSet.html#getString(int)

Bom um pega a coluna pelo nome independente da ordem em que ele ta e o outro pega a coluna baseada na ordem que vem (ideal pra quando você não sabe os nomes das colunas)

quem implementa um ResultSet é o fabricante do Driver, então se tem diferença de desempenho depende de como ele implementou, mas se houver deve ser insignificante

fabim

Usando indices, o custo que vc vai ter depois pra manter esse codigo qdo adicionar uma coluna ou retirar alguma ( vai te que redefinir os outros indices ) nao compensa o ganho de desempenho (que se houver, deve ser imperceptível)…

louds

Pensando de forma racional, não deveria ter um custo alto mesmo, o nome das colunas deveriam ficar em um HashMap e o tempo adicionar não seria muito grande. Porém alguns drivers, em especial Oracle e MySql, são toscos nesse sentido e quanto mais colunas, mais lento é.

Usar o número da coluna só vale a pena se você estiver com problemas de performance nesse ponto em particular, senão concordo com o Fabio que não vale a dor de cabeça.

kadekdu

até esse ponto eu tb concordo com vcs… mas tinha esquecido de falar…

seguinte…
uso oracle…
e no caso… seriam em média 3.000 registros por segundo…

se no caso de 10 registros realmente não terem um ganho de performance significativo, esses 3.000 por segundo (em média), teriam algum resultado de performance significativo?

valeu desde já!!

abraços

fabim

Testei com o driver da oracle, pra 10.000 registros:

Com nome coluna => tempo medio : 203ms
Com indice da coluna => tempo medio : 200ms

Resultado do meu pto de vista: nao vale a pena.

linconcp

Fiz um teste com DB2, pegando 1.000 registros.

Sem indice: entre 1000 e 1200 ms
Com indice: entre 800 e 1000 ms.

Mas, apesar da diferença, concordo com o fabiocsi. Não vale a pena pela dor de cabeça na manutenção.

Criado 23 de outubro de 2007
Ultima resposta 23 de out. de 2007
Respostas 6
Participantes 5