Mantendo conexao com o banco

como eu posso tentar fazer pra manter a mesma conexao com o banco?

por exemplo, eu faço um login com usuario e senha já direto com o banco, e nao em uma tabela de permissoes. Ou seja, eu já faço uma conexao direto.

e mais na frente, quero gerar um relatorio no jasperreports, mas em vez de criar outra conexao, quero usar a que já tenho.

só que quando vou atras da conexao aberta antes, dá null.

é possivel jogar a conexao na sessao, e ai na hora de gerar o relatorio, minha classe do relatorio recebe do jsp o objeto da conexao?

Pelo jeito vc está falando de um projeto Web, é isso? Pode colocar o sua conexão na sessão sim!

Possível é, mas isso é perigoso fazer, pois dependendo do número de usuários que você tiver, pode estourar o limite de conexões abertas. Além de você pode esquecer de fechar as conexões quando dar session timeout.

é um pequeno projeto web, so pra gerar 1 relatorio

vou testar aqui colocando a conexao na sessao

antes eu tava conectando pro login e logo depois fechando, e a tela seguinte recebia o usuario e senha pra conectar de novo pra gerar o relatorio. Ai nessa segunda tela eu envio esses dois pra classe como hidden, e logo depois de gerar o relatorio, ja fecho a conexao de novo

to usando o mentawai

Você pode colocar os dados do usuário na sessão em vez de ficar enviando a todo instante. Economiza o seu trabalho.

foi isso que eu tentei fazer

[quote]if ((con = c.Conexao())!=null) {
output.setValue(“usuario”,usuario);
output.setValue(“senha”,senha);
}[/quote]

mas, passar a conexao para a sessao significa pegar a string de conexao e mandar pro jsp, e desse jsp manda de volta pra outra classe?

exemplo: oracle.jdbc.driver.OracleConnection@da6bf4

se for, eu consigo fazer. mas la na outra classe nao consigo fazer a variavel ‘Con’ aceitar essa String de conexao. ja tentei tratar como object tambem e nao vai

[quote]Object o = input.getValue(“conexao”);
con = (Connection)o;[/quote]
ai dá o erro: java.lang.ClassCastException: java.lang.String

la no jsp eu armazeno essa string de conexao como hidden tambem

Calma, calma, calma. Estou imaginando o espaguete que deve estar seu código e a facilidade que isso tenho te induzido ao erro (engano).

Primeiro que você não está entendendo direito o que você está fazendo, ou deveria fazer.

Você está usando Servlets? Apenas JSP? Ah! Você mencionou que usa o Mentawai.

Na sua Action você pode fazer assim:

[code]String usuario = null;
String senha = null;
HttpSession session = request.getSession();
if( session.getAttribute(“USUARIO”) == null ) {
usuario = input.getStringValue(“usuario”);
senha = input.getStringValue(“senha”);
session.setAttribute(“USUARIO”, usuario);
session.setAttribute(“SENHA”, senha);
} else {
usuario = session.getAttribute(“USUARIO”);
senha = session.getAttribute(“SENHA”);
}
Connection conn = criarConexao( usuario, senha );

//se quiser passar a conexão pro JSP
request.setAttribute(“conn”, conn);[/code]

Mesmo assim esse código não é o mais indicado, pois foge das boas práticas, mas já é um começo.

Porque não usa o pool de conexões do próprio Mentawai?
http://www.mentaframework.org/connfilter.jsp

Se vc não quer usar o pool de conexões não tem problema.

Vc pode fazer do feito que vc quiser/preferir.

Implementa a interface ConnectionHandler e seja feliz.

Ou faz como o Daniel falou.

Não complica o simples…

Vc quer abrir uma conexão e usar ela pra sempre ??? Isso é horrível mas tudo bem… Usa o pool de conexão e não complica…

E se vc quer várias conexões, um para cada action/usuário, então usa vários pools de conexões e seta o ConnectionFilter per action e não como global.

daniel, valeu ai a atencao

eu fico meio perdido nisso mesmo, mas meu codigo ta bem pequeno…só ta errado…

eu nao queria usar o HttpSession e os set + get Attribute, mas deve ser o melhor baseado no que eu consigo entender. Entendi o codigo que voce colocou, e eu tava viajando sobre a conexao na sessao

no mentawai, sobre as conexoes, eu preciso ler mais pra entender, nao sai facil. tem tb a maneira de fazer login do mentawai que eu vou olhar, pq aumenta o controle

Usa o pool de conexão mesmo, junto com o ConnectionFillter. Não tem mistério…



        this.connHandler = new C3P0ConnectionHandler("com.mysql.jdbc.Driver", 
                                                     "jdbc:mysql://localhost/mentafra_mybooks?autoReconnect=true", 
                                                     "mentafra_mybooks", 
                                                     "mybooks");
                                                     
        C3P0ConnectionHandler c3p0 = (C3P0ConnectionHandler) connHandler;
        ComboPooledDataSource pool = (ComboPooledDataSource) c3p0.getComboPooledDataSource();
        pool.setMaxIdleTime(5); // 5 min before it is closed... (avoid Communication Link Failure!)

Daí vc pode setar esse pool como global via um ConnectionFilter global, ou se vc precisar de outros usuário do banco de dados, vc cria outros pools e aplica eles na action correspondente.

Qualquer dúvida posta lá no forum do mentawai…