Clusterização

14 respostas
spranta

Oi pessoal, estou com uma aplicação pronta para entrar em produção, já passei ela para o Aplication Server que será utilizado e deu tudo certo, no entanto, a aplicação será clusterizada em uma outra máquina e então eu fiz um deploy nesta, mas agora o sistema se comporta de forma instável, ou seja, ora ele consegue executar as requisições mas na maioria das vezes ele lança a seguinte exceção na tela do browser:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.next(HashMap.java:731)

Enquanto que no console do AplicationServer aparece esta outra exceção:
java.sql.SQLException: Io exception: Connection reset by peer: socket write error

Será que alguém poderia me dar uma luz de como resolver este problema.
Valeu pessoal
Otávio

14 Respostas

louds

Seu problema não está sendo causado por causa do cluster e sim pq alguem fez alguma besteira com um HashMap da sua aplicação.

Um Iterator não pode ser utilizado se a coleção dele for alterada apos a criação dele. Parece um problema de sincronização.

Boa sorte.

ozielneto

Resolva aplicando o Pattern ValueListHandler, impedindo da alguem usar o Iterator do HashMap que esta em memoria…

[]'s

spranta

Mas então, eu conferi tudo e não consegui visualizar na minha aplicação aonde é que existe alguma referencia em relação ao Iterator do HashMap. Eu suspeito do cluster pelo fato da aplicação já estar sendo testada a mais de um mês em uma máquina não clusterizada, inclusive com acessos concorrentes e nunca deu problema neste sentido. E nesta máquina aonde está o cluster basta um usuário acessar o sistema que na maioria das ações aquela exceção é lançada, agora eu realmente uso muito a classe Vector, pode ter alguma coisa a ver. No entanto, li um pouco e este padrao Value List Handler me pareceu ser bastante util, no entanto nao entendi como vou fazer ele me ajudar neste caso, alguem pode me dar um exemplo ou alguma dica.
Mais um vez valeu pessoal…
Spranta

ozielneto

Esta acontecendo um erro de Concorrencia…

O ValueListHandler vai permitir que voce controle a concorrencia mais eficasmente… Usando um SessionBeanStateless de preferencia…

A Vector ou Hashtable, sao estruturas sincronizadas internamente, causando problemas serios de performance… Sao legados da JDK 1.1.

O HashMap, quando possui acesso sincronizado, deve ter esse acesso ser controlado…

[]'s

T

Achei estranho o fato de ter um java.sql.SQLException. Aparentemente a conexao com o Bando de Dados foi encerrada por algum motivo. Sugiro que de uma pesquisada nesse ponto.

spranta

Então Oziel, eu estou usando o Vector quando eu faço uma consulta e então eu mando o conteudo do RersulSet para este, assim eu armazendo o Vector na session e o recupero na jsp para apresentação, vc acha que realmente é esse o problema?
Agora voce sugeriu usar o sessionBeanStateless, aí eu acho que eu teria que implementar um EJB, não é? Pois outro problema é que não estamos trabalhando com EJB, eu nem sei muito bem como é toda a estrutura de um EJB. E se eu tiver que deixar de usar Vector eu vou ter que mudar muita coisa, muita coisa mesmo, além do que eu ainda não entendi muito bem esse padrao ValueListHandler. Enfim, existe alguma maneira de resolver este problema sem ter que implementar um EJB e continuar usando os Vector. Parece que como vc falou a solução seria mesmo usar o ValueListHandler mas se realmente for vc poderia me falar mais sobre este, enfim, um introdução para que eu possa ter ideia de como começar.
Obrigado de novo.
Spranta

louds

Voce não tem nenhum stacktrace das exceptions lançadas?

spranta

Tenho, aí estão:

Exception Information

java.util.ConcurrentModificationException


Stack Trace

java.util.ConcurrentModificationException

at java.util.HashMap$HashIterator.next(HashMap.java:731)

at com.sssw.srv.compctx.AgInvocationContextMgr.notifyBeforeDeactivating(AgInvocationContextMgr.java:158)

at com.sssw.srv.compctx.AgInvocationContextMgr.deActivateInvocationContext(AgInvocationContextMgr.java:103)

at com.sssw.srv.resources.AgWarResource.service(AgWarResource.java:683)

at com.sssw.srv.resources.AgWarURLResource.perform(AgWarURLResource.java:115)

at com.sssw.srv.http.httpd.perform(httpd.java:5571)

at com.sssw.srv.http.Client.processRequest(Client.java:898)

at com.sssw.srv.http.Client.loop(Client.java:1264)

at com.sssw.srv.http.Client.runConnection(Client.java:1480)

at com.sssw.srv.http.Client.run(Client.java:1428)

at java.lang.Thread.run(Thread.java:479)

Outra:

java.sql.SQLException: Io exception: Connection reset by peer: socket write error

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210)

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:323)

at oracle.jdbc.driver.OracleConnection.setAutoCommit(OracleConnection.java:799)

at com.sssw.srv.sql.AgUserConnection.setAutoCommit(AgUserConnection.java:381)

at com.bd.Conexao.getConnection(Conexao.java:60)

at com.bd.AcessoPadrao.AplicarSQL(AcessoPadrao.java:257)

at com.sac.TUsuario.ExisteRegistro(TUsuario.java:143)

at com.servlets.Login.doPost(Login.java:105)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at com.sssw.srv.busobj.AgoFilterChain.doServlet(AgoFilterChain.java:395)

at com.sssw.srv.busobj.AgoFilterChain.doFilter(AgoFilterChain.java:179)

at com.filtro.Filtro.doFilter(Filtro.java:44)

at com.sssw.srv.busobj.AgoFilterChain.doFilter(AgoFilterChain.java:140)

at com.sssw.srv.resources.AgWarResource.service(AgWarResource.java:638)

at com.sssw.srv.resources.AgWarURLResource.perform(AgWarURLResource.java:115)

at com.sssw.srv.http.httpd.perform(httpd.java:5571)

at com.sssw.srv.http.Client.processRequest(Client.java:898)

at com.sssw.srv.http.Client.loop(Client.java:1264)

at com.sssw.srv.http.Client.runConnection(Client.java:1480)

at com.sssw.srv.http.Client.run(Client.java:1428)

at java.lang.Thread.run(Thread.java:479)
Luca

Olá

Não conheço o SilverStream mas sei que tem várias versões. De http://www.serverwatch.com/sreviews/article.php/1433211:
[list]The server itself starts at $8,500 for a 1 processor/unlimited users license and scales to $17,000 for 2 processors, $34,000 for 4 processors, and $51,000 for 6 processors. While these prices are on the higher side, they are competitive with other application servers on the market. SilverStream pioneered the application-server market with the original release of the SilverStream application server. With the release of 2.0, SilverStream keeps pushing the envelope on what should be expected from an enterprise-level application server.
[/list]

Talvez sua versão do SilverStream seja a de 1 processador

Veja tb: Clustering technology is crucial to good Website design; do you know the basics?

[]s
Luca

louds

Isso me parece algum erro do seu AS, dado que não tem nenhuma classe sua envolvida, pode ser tanto algum erro de configuração como pau do AS mesmo. Como eu nunca usei SilverStream não posso te ajudar mais que isso.

“spranta”:

Outra:

java.sql.SQLException: Io exception: Connection reset by peer: socket write error

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210)

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:323)

at oracle.jdbc.driver.OracleConnection.setAutoCommit(OracleConnection.java:799)

at com.sssw.srv.sql.AgUserConnection.setAutoCommit(AgUserConnection.java:381)

at com.bd.Conexao.getConnection(Conexao.java:60)

at com.bd.AcessoPadrao.AplicarSQL(AcessoPadrao.java:257)

at com.sac.TUsuario.ExisteRegistro(TUsuario.java:143)

at com.servlets.Login.doPost(Login.java:105)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at com.sssw.srv.busobj.AgoFilterChain.doServlet(AgoFilterChain.java:395)

at com.sssw.srv.busobj.AgoFilterChain.doFilter(AgoFilterChain.java:179)

at com.filtro.Filtro.doFilter(Filtro.java:44)

at com.sssw.srv.busobj.AgoFilterChain.doFilter(AgoFilterChain.java:140)

at com.sssw.srv.resources.AgWarResource.service(AgWarResource.java:638)

at com.sssw.srv.resources.AgWarURLResource.perform(AgWarURLResource.java:115)

at com.sssw.srv.http.httpd.perform(httpd.java:5571)

at com.sssw.srv.http.Client.processRequest(Client.java:898)

at com.sssw.srv.http.Client.loop(Client.java:1264)

at com.sssw.srv.http.Client.runConnection(Client.java:1480)

at com.sssw.srv.http.Client.run(Client.java:1428)

at java.lang.Thread.run(Thread.java:479)</blockquote>

Aqui me parece ser um erro no gerenciamento das conecções com o banco. Vc tá usando algum pool? Gerenciando na mão?
ozielneto

De uma olhada nas configuracoes do ConnectionPoll do SilverStream…

Pode ser que ele esta encerrando as conexoes com elas em uso…

[]'s

spranta

Pois entao, a versao do SilverStream daqui é 4.0 - não souberam me informar ainda para quantos processadores mas falaram que é a versão com suporte a clusterização.
Quanto a conexao com bd, realmente eu estou usando um pool de conexoes que é todo configurado no proprio SilverStream. O interessante é justamente isso, eu consigo por vezes me conectar ao banco e tudo acontece beleza, mas quando dá erro a exception java.util.ConcurrentModificationException vem acompanhada da java.sql.SQLException: Io exception: Connection reset by peer: socket write error
e por isso é bem provável que como vc falou ele pode estar encerrando as conexoes com elas em uso, meio complicado né.
Se alguem tiver alguma ideia aí, me de um toque
Valeu pessoal
Spranta

Luca

Olá

Connection reset by peer é um erro meio genérico e que acontece com relativa freqüência. Pode até ser que este segundo erro seja causado pelo primeiro.

Fui ver o que é este tal de SilverStream e achei o seguinte:

SilverStream eXtend Application Server 4.0.1 - Release Notes

Install Guide

Chapter 10 Administering a Cluster

Fórum Novell

Gente que não gosta do SS:
SilverStream: the Good, the Bad, and the Ugly (antigo, 2001)

SilverStream By The Numbers (Mais antigo ainda, 1999)

[]s
Luca

spranta

Olá pessoal, eu andei depurando melhor a aplicação e descobri que a exceção está sendo lançada sempre quando dou um setAutoCommit(false)na conexão recem obtida do pool. Aí eu venho na minha ignorância perguntar aos senhores, será que em um ambiente clusterizado a conexão precisa estar sempre com o autoCommit como true para que haja melhor sincronização? Vou mudar aqui e vou fazer um novo deploy para testar, aí depois eu dou uma resposta para vcs, enquanto isso espero tambem qualquer outra dica.
Valeu pessoal
Spranta

Criado 2 de fevereiro de 2004
Ultima resposta 3 de fev. de 2004
Respostas 14
Participantes 5