EJB´s e JDBC

2 respostas
R

Olá:



É possível acessar um Banco de Dados diretamente? Sem a intermediação do Conteiner e do EJB-QL (eca!)?

Sei que um dos atrativos dos EJB´s é justamente o código não se "preocupar" com o Banco de Dados, usando no lugar os findByQualqueCoisa e os Selects com o EJB-QL escrito em um arquivo XML à parte. Entretanto o EJB-QL é muito limitado. Sei que vai ser incrementado na próxima versão. Mas até lá tenho que me virar de outra forma.

Por exemplo: tenho o meu SessionBean (ou EntityBean). Tenho que usar um Objeto java.sql.Connection para entrar em contato com o BD. Fora do universo dos EJB´s eu faria java.sql.DriverManeger.getConnection(), depois de passar a classe do driver JDBC. E num EJB como faria?



Grato,

2 Respostas

F

Olá,



vc pode usar um framework de persistência. O meu preferido é o OJB(http://db.apache.org/ojb) Ele tbm trabalha com EJBs, apesar de eu nunca ter usado esta feature.



Abraço,



Franklin Samir

"Diga não ao EJB! :-)"





P
Ola, Rafael.





Se tudo o que voce quer saber eh como obter uma Connection a partir de um EJB, aqui a resposta:





Voce deve obter um DataSource a partir do contexto JNDI do seu servidor de aplicacoes. Por exemplo, suponha que voce tenha um DataSource instalado no nome java:/DefaultDS. Voce faria o seguinte codigo para obter uma conexao direta com o banco de dados:





import java.sql.Connection;


import javax.naming.InitialContext;


import javax.sql.DataSource;





InitialContext context = new InitialContext();


DataSource ds = (DataSource) context.lookup(java:/DefaultDS");


Connection conn = ds.getConnection();





Se o seu servidor de aplicacoes for capaz de prover DataSources atraves de multiplas JVMs, o objeto retornado pelo lookup pode precisar ser estreitado. Dica: se o nome JNDI que voce esta procurando comecar com "java:", significa que o objeto deve estar na mesma JVM, portanto nao precisa ser estreitado. Se nao comecar, pode precisar. E aqui esta o codigo pra isso:





import java.sql.Connection;


import javax.naming.InitialContext;


import javax.rmi.PortableRemoteObject;


import javax.sql.DataSource;





InitialContext context = new InitialContext();


Object obj = context.lookup("DefaultDS");


DataSource ds = (DataSource) PortableRemoteObject.narrow(obj, DataSource.class);


Connection conn = ds.getConnection();





O ideal eh voce colocar o codigo para obter a conexao em algum metodo privado do seu bean (ou em uma classe mae de todos os beans) e entao utiliza-lo sempre que precisor de uma conexao. Se voce comecar a usar isso muito, pense em utilizar o padrao de projeto conhecido como "<a>Data Access Object</a>" para abstrair o acesso ao banco de dados.

[ Esta mensagem foi editada por: pazu em 24-03-2003 09:57 ]
Criado 26 de fevereiro de 2003
Ultima resposta 24 de mar. de 2003
Respostas 2
Participantes 3