[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 
Erro ao rodar aplicação em mentawai e hibernate com postgresql replicado por drbd  XML
Forum Index -> Comentários Gerais
Author Message
flaviomreis


[Avatar]
Joined: 21/03/2006 11:23:28
Messages: 75
Offline

Olá a todos!

Desculpe incomodá-los e se este não é o local exato para postar isto, mas creio que seja algo relacionado a mentawai ou tomcat.

Estou usando Debian Etch e postgresql-8.1. Minha partição de dados está em /dev/hda3 e montada em /mnt/data e sendo replicada com drbd para outra máquina. Quando desligo a primária, a secundária monta a partição de dados e inicia o postgresql-8.1 tudo bonitinho, consigo acessar a base e tudo mais. O problema é a aplicação que, rodando em outra máquina, não funciona mais retornando o seguinte:
Code:
 type Exception report
 
 message
 
 description The server encountered an internal error () that prevented it from fulfilling this request.
 
 exception
 
 javax.servlet.ServletException: javax.servlet.ServletException: Invalid constant pool index 49 for field signature in class file org/apache/jasper/servlet/JspServletWrapper
 	org.mentawai.core.Controller.service(Controller.java:196)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 
 root cause
 
 org.mentawai.core.ConsequenceException: javax.servlet.ServletException: Invalid constant pool index 49 for field signature in class file org/apache/jasper/servlet/JspServletWrapper
 	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:272)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 	org.mentawai.core.Forward.forward(Forward.java:110)
 	org.mentawai.core.Forward.execute(Forward.java:94)
 	org.mentawai.core.Controller.service(Controller.java:192)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 
 note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.
 


Enquanto que na mesma máquina secundária, que agora está com a base de dados iniciada, consigo acessar normalmente. Detalhe, nesta máquina secundária uso o tomcat 5.5.16.

Abraços e desculpem qualquer transtorno.

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
flaviomreis@gmail.com
[MSN]
flaviomreis


[Avatar]
Joined: 21/03/2006 11:23:28
Messages: 75
Offline

Bom, adiantando-me, troquei o tomcat 5.5.17 para 5.5.16 e não tive problema com uma ação que só lê a base de dados:
Code:
 public class InProdutoConsulta extends BaseAction {
     
     public String execute() throws Exception {
         Session hbSession = (Session)input.getValue(HibernateFilter.KEY);
         Random rndProduto = new Random(Calendar.getInstance().getTimeInMillis());
         int randomProduto = rndProduto.nextInt(10000);
         
         Produto produto = (Produto)hbSession.createQuery("from Produto").list().get(randomProduto);
         output.setValue("produto", produto);
         
         return SUCCESS;
     }
     
 }
 


Agora estou tentando com outra ação que faz tanto leitura quanto escrita e dá o erro:
Code:
 type Exception report
 
 message
 
 description The server encountered an internal error () that prevented it from fulfilling this request.
 
 exception
 
 javax.servlet.ServletException: javax.servlet.ServletException: org/apache/jasper/runthme/JspSourceDependent
 	org.mentawai.core.Controller.service(Controller.java:196)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 
 root cause
 
 org.mentawai.core.ConsequenceException: javax.servlet.ServletException: org/apache/jasper/runthme/JspSourceDependent
 	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:272)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 	org.mentawai.core.Forward.forward(Forward.java:110)
 	org.mentawai.core.Forward.execute(Forward.java:94)
 	org.mentawai.core.Controller.service(Controller.java:192)
 	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 
 note The full stack trace of the root cause is available in the Apache Tomcat/5.5.16 logs.
 


O código desta ação é o seguinte:
Code:
 public class InCompraCompleta extends BaseAction {
     
     public String execute() throws Exception {
         String txtFornecedorId = input.getStringValue("txtFornecedorId");
         Integer fornecedorId;
         
         try {
             fornecedorId = new Integer(txtFornecedorId);
         } catch (NumberFormatException e) {
             
             return ERROR;
         }
         
         Session hbSession = (Session)input.getValue(HibernateFilter.KEY);
         Transaction transaction = hbSession.beginTransaction();
         
         Fornecedor fornecedor = (Fornecedor)hbSession.get(Fornecedor.class, fornecedorId);
         Compra compra = new Compra();
         compra.setFornecedor(fornecedor);
         compra.setData(Calendar.getInstance().getTime());
         hbSession.save(compra);
         
         Random rndGrupo = new Random(Calendar.getInstance().getTimeInMillis());
         Random rndProduto = new Random(rndGrupo.nextLong());
         Random rndQuantidade = new Random(rndProduto.nextLong());
         
         for (int i = 0; i < 10; i++) {
             int randomGrupo = rndGrupo.nextInt(10);
             int randomProduto = rndProduto.nextInt(1000);
             int randomQuantidade = rndQuantidade.nextInt(10);
             
             Grupo grupo = (Grupo)hbSession.createCriteria(Grupo.class).list().get(randomGrupo);
             Produto produto = (Produto)hbSession.createQuery("from Produto where grupo = :grupo").setEntity("grupo", grupo).list().get(randomProduto);
             
             ItemCompra itemCompra = new ItemCompra();
             itemCompra.setCompra(compra);
             itemCompra.setProduto(produto);
             itemCompra.setPrecoUnitario(produto.getPrecoUnitario());
             itemCompra.setQuantidade(randomQuantidade);
             hbSession.save(itemCompra);
         }
         
         transaction.commit();
         
         output.setValue("compra", compra);
         
         return SUCCESS;
         
     }
     
 }
 


Valeu...

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
flaviomreis@gmail.com
[MSN]
Lobo


[Avatar]

Joined: 23/01/2006 02:17:14
Messages: 841
Location: Fortaleza-CE
Offline

Caro Flávio,

Não entendi o que você quiz dizer com "aplicação rodando em outra máquina" você colocou o banco de dados em duas máquinas e tomcat em duas máquinas ? cada uma referenciando a localhost para o banco ?


Mais uma coisa, que tipo de configuração de conexão de banco de dados você esta usando ? DataSources do tomcat ? ou abrindo conexão direto no código a partir de classe utilitária ? hibernate.properties ? hibernate.cfg.xml ?

Poderia apagar todos os logs do tomcat e tentar forçar esse erro, depois mandar um trecho dos arquivos de log catalina.out e localhost.2006-05-??.log ?

Uso mentawai no slackware e mandriva , bem como tomcats 5.5.16, 5.5.12, 5.5.17, oracle e mysql, nunca vi esse erro. Mas ocorre do oracle cair(na máquina de desenvolvimento) ai reinicio o tomcat DEPOIS de reiniciar o oracle. (estou usando datasource no tomcat)

Atenciosamente,
Hélio Frota



Atenciosamente,
Hélio Frota

Helio Frota
10+ Java Programmer
heliofrota.com

Member
Mentawai Developer
flaviomreis


[Avatar]
Joined: 21/03/2006 11:23:28
Messages: 75
Offline

Valeu pela atenção Lobo, descobri o problema, era a memória desta terceira máquina que estava com problema, troquei, instalei o tomcat e a aplicação novamente e tudo beleza agora.

Explicando novamente. Tenho um cluster onde a máquina 192.168.0.40 tem a base de dados postgresql e as máquinas 192.168.0.43 e 192.168.0.44 rodam uma pequena aplicação que fiz com hibernate e mentawai, utilizo os filtros do mentawai para gerenciar as sessões do hibernate. O cluster responde pelo ip 192.168.1.50. Quando a máquina 192.168.0.40 falha, a 192.168.0.43 passa a responder no ip 192.168.1.50 e inicia um servidor postgresql com os dados que estavam sendo espelhados da máquina 192.168.0.40 (por drbd) e então a máquina 192.168.0.44 restart o tomcat (para refazer a conexão com o "novo" servidor de banco de dados).

Agora está quase tudo beleza. O problema é que não descobri ainda como fazer para a máquina 192.168.0.44 dar um restart quando a 192.168.0.40 falha.

Abraços a todos

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
flaviomreis@gmail.com
[MSN]
Lobo


[Avatar]

Joined: 23/01/2006 02:17:14
Messages: 841
Location: Fortaleza-CE
Offline

Beleza cara, agora acho meio estranho um endereço de memória afetar na JVM, até porque ela aloca etc. etc. etc. até onde eu sei conseguiram apenas alterar valores de ponto flutuante superaquecendo a memória intencionalmente O_0 .

Mas tudo bem se deu certo é comemorar e bola pra frente :]

Saquei o que você tá querendo :], pro meu caso do pensando em criar um shell script pra pingar o banco, agendado no cron, quando o ping não responder dispara o ./shutdown.sh e depois o ./startup.sh do tomcat.

Eu to pensando em fazer isso pro meu caso, nunca tentei mas to pensando em implementar, não sei se o tem como configurar o tomcat pra saber quando ele perde a conexão com o banco e fazer reload automático. E nem sei se vai funcionar esse pooling nesse script mas vou tentar.

Atenciosamente,
Hélio Frota

Atenciosamente,
Hélio Frota

Helio Frota
10+ Java Programmer
heliofrota.com

Member
Mentawai Developer
flaviomreis


[Avatar]
Joined: 21/03/2006 11:23:28
Messages: 75
Offline

Cara, doidura também, tava com um problema usando Debian Etch Kernel 2.6.15, Java 1.5.0.6, Hibernate 3.1.2 (com CGLIB 2.1.3) e tomcat 5.5.16... Tava dando uns paus numa ação que faz consulta no banco, após 1500 execuções ele gerava uma exceção e tinha que restartar o tomcat... aí pesquisei e pelo que entendi é um problema na implementação do CGLIB para linux que é diferente da implementação do Ruindous. Só que passei a usar JDK6 Beta e não tive mais problemas. Agora não lembro, mas dava um erro de NoSuchMethod em uma POJO e LazyInicialization,,, Sei lá, não entendo direito ainda de hibernate.

Bom, neste meu cluster, tenho em todos os nós um aplicativo em java (que fiz) que fica "lendo" a porta 4444 (hehehe herança dos tutoriais da Sun) e cada vez que recebe uma string "get" ele retorna a linha que começa com "cpu" do arquivo /proc/stats (isto para eu calcular a utilização da CPU de cada nó). Daí aproveitei este mesmo serviço e quando recebe um "restart service" ele dá um shutdown.sh seguido de um startup.sh. Fiz um script para heartbeat (no secundário) que roda depois da inicialização do servidor de banco de dados para que envie um echo "restart service" | netcat realserverip 4444.

Puxa vida, desculpe estar comentando coisas que não tem nada a ver aqui...é que me empolguei... Abraços a todos

Flávio Menezes dos Reis
Bacharel em Sistemas de Informação
flaviomreis@gmail.com
[MSN]
Lobo


[Avatar]

Joined: 23/01/2006 02:17:14
Messages: 841
Location: Fortaleza-CE
Offline

huauhhauhuahuh, daqui a pouco a gente cria uma distro so pra fazer reload no tomcat !

Se a conversa fosse de slackware confesso que iria me empolgar mais ainda.

Valeu




Atenciosamente,
Hélio Frota

Helio Frota
10+ Java Programmer
heliofrota.com

Member
Mentawai Developer
 
Forum Index -> Comentários Gerais
Go to:   
Powered by JForum 2.1.6 © JForum Team