Eu testei aqui e ele nao fecha a conexão naoo…ela continua “ligada”…
ele da a seguinte exception:
java.lang.NullPointerException
at com.mysql.jdbc.StatementImpl.useServerFetch(StatementImpl.java:2567)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1353)
at metodos.BD.setResultSet(BD.java:103)
at beansDb.PendenciaDb.getPendenciasAtivas(PendenciaDb.java:218)
at metodos.ThreadVerificaPendencia.run(ThreadVerificaPendencia.java:26)
at java.lang.Thread.run(Thread.java:619)
Mas outras coisas nesse código cheiram a POG, e dos feios.
O resultset e o statement não deveriam ser propriedades da classe BD, muito menos públicas. É necessário criar um Statement diferente por thread. E é também recomendável fechar a conexão no finally.
Como a conexão é um recurso demorado de ser obtido, o ideal é também usar o apache DBCP ou o C3P0 para fazer um pool de conexões.
Do jeito que está, ambas as threads compartilham o mesmo resultset e statement. Sem falar que as propriedades estão excessivamente permissivas, permitindo, por exemplo, que um programador as defina para null.
Como já foi dito, em uma situação de concorrência sua classe vai dar pau - ai você lasca um syncronized e perde a vantagem do paralelistmo.
Mas o que está mais estranho é a classe TER uma instância de ResultSet, e se outra Thread mandar executar o método setResultSet quando uma outra thread ainda está lendo os resultados anteriores?
Melhor você rever algumas questões de desenho desta classe.
entaoo…para isso eu fiz um Gambiarra suahsuahsuahsa…
pq esse projeto ja ta muito adiantado…e ai eu preciso terminar ele logo…e depois quando tiver mais tempo eu volto pra consertar algumas coisas rsrs…
pq o q eu fiz pra consertar foi o seguinte:
eu criei 3 resultSets, 3 statements e 3 metodos setResultSet…
aiii…qualqer operação eu mando pra o resultSet1…uma thread vai no setResultSet2, e a outra thread vai para o setRresultSet3…
eh uma puta gambiarra…mas por enquanto vo te q dexa assim rsrs…
depois eu volto pra consertar…rsrs
String res = "2";
try
{
st = BD.connection.createStatement();
rs = st.executeQuery("SELECT * FROM usuario WHERE usuario='"+usuario+"' AND senha='"+senha+"'");
rs.next();[/code]
Acho que vc construiu uma “arapuca” e está pulando para dentro com tudo.
Se o código da classe BD não for muito grande tente inclui-la em um post para a galera dar uma olhada e tentar construir uma solução mais segura e mais organizada pra te ajudar.
Não é correta. Se você incluir a palavra “static”, dificilmente estará usando a forma correta.
Infelizmente, não é tão trivial te explicar como é a forma correta.
Entretanto, para uma correção simples no seu código essa forma está adequada. Só marque esse método também como synchronized para que duas threads não tentem acessa-lo ao mesmo tempo.