Problemas com prepareStatement

9 respostas
D

Alguem sabe me dizer se quando faco o comando

stmtMeuStatement = conexao.prepareStatement(minhaString);

uma nova conexao é aberta com o BD? Isso esta acontecendo realmente.
Gostaria de saber se existe alguma opcao o configuracao para que isso nao aconteca

9 Respostas

ozielneto

Pela especificação do JDBC este método não deveria em hipótese alguma abrir outra conexão com o banco.

Resta saber se o Driver JDBC que voce está usando, segue as especificações da JavaSoft.

Ou Seja, considere que este conjunto de métodos NÃO VAI ABRIR uma nova conexão.

[]'s

D

Estou usando o BD MSSQLServer 2000 e o driver jdbc da microsoft baixado no site da microsoft.

Sempre que dou o comando :

stmt = conexao.prepareStetement(string) ;

mais de uma vez com o mesmo objeto conexao uma nova conexao é aberta com a base (posso verificar isso no manager do sqlserver)

obs. : quando faco esse comando apenas uma vez nao é aberta nova conexao.

Será que uma conexao suporta apenas um PrepredStatement?

Obrigado.

ozielneto

Acho que esse comportamento deve-se ao Driver que voce está usando…
Tente trocar o Driver…

dukejeffrie

Pode também ser o banco, ele mencionou Microsoft…

O caso é que um Statement deve ser independente dos outros statements na mesma conexão: por exemplo, cada um tem um resultset separado, e execução independente.

Para forçar isso num banco onde cada conexão tem apenas um ResultSet(!), o driver pode gerar outra conexão de baixo nível, manter as duas associadas com o mesmo objeto Connection, mas dar cada uma a um Statement diferente.

Talvez seja hora de vc contar pra gente por que vc não quer que o banco receba mais conexões de baixo nível. Lembre-se que fechar os Statements é responsabilidade sua, com o método close(), mas o JDBC se vira para prover as funcionalidades que vc precisa…

provavelmente ainda dá tempo de vc mudar pro Postgres… :wink:

[]s

D

Estou desenvolvendo um sistema p/web e o problema é o seguinte:

Por ordens da empresa, existe um relatorio "monstruoso" que utiliza 43 consultas, ou seja,  seriam 43 Statements, ou 43 chamadas ao metodo prepareStatement() se utilizar apenas um Statement. 
Portanto com varios acessos simultaneos se esgotam rapidamente as conexoes disponiveis no pool de conexoes.  Existem  alguns grupos de 7 ou 8 consultas que dependem umas das outras, portanto nao posso fechar o Statement assim que utilizo cada um. Tenho que fecha -los de acordo com o fim de um bloco por ex. Mesmo assim ainda são muitas conexoes abertas ao mesmo tempo por um usuario e ocorre o estouro do pool.

Gostaria se possiel de alguma indicação de driver que gerenciasse melhor isso pois nao posso mudar de BD (ordens da empresa).

Agredeço.

[]s

Rafael_Steil

Basta voce abrir uma unica conexao por usuario, e nao uma por statement. O unico trabalho que voce tera eh ter que passar os objetos Connection pegos do pool entre os metodos.

Rafael

dukejeffrie

isso não adianta, pq o JDBC não tá colaborando com ele.

ele abre um statement com a mesma Connection, e internamente o JDBC abre outra conexão com o banco.

Acabei de lembrar que existem vários drivers que suportam MSSQL… tenta achar um mais novo… c tá usando o driver da Microsoft?? Tenta usar o jTDS, projeto no sourceforge.

[]s

Rafael_Steil

Nao sei se eh bem isso ( apesar de ja ter ouvido relatos sobre o que voce comecou ). Veja, se internamente o JDBC abre conexoes com o banco, o pool dele nao deveria esvaziar “sozinho”… ou o jdbc “adivinha” que tem um pool e puxa de la?

Eu faco o lance de passar as Connection e pra requisicao toda uso somente uma unica conexao… do pool eu tenho certeza que somente sao puxadas as necessarias…

Rafael

D

Tiago,

sabe me dizer se esse driver jTDS da sourceforge da suporte a pool de conexoes?

[]s

Criado 15 de abril de 2003
Ultima resposta 28 de abr. de 2003
Respostas 9
Participantes 4