JNDI iniciantes - Esta é a melhor maneira?

13 respostas
V

Opa eae galera blz????

seguinte estou comecando a desenvolver um projeto web, estou usando do lado servidor java (servlets)
e do lado cliente estou usando Extjs.
Minha pergunta é se esta estrutura esra correta ou se usam outra. estou comecando agora e preciso ver isto.

tenho minha classe Conexao
public class Conexao{
Connection conn;


private void conexao() {
		String url = "jdbc:postgresql://localhost:5432/APL";
		try {
			Class.forName("org.postgresql.Driver");
		} catch (java.lang.ClassNotFoundException e) {
			System.err.print("ClassNotFoundException: ");
			System.err.println(e.getMessage());
		}

		try {
			conn = DriverManager.getConnection(url, "postgres", "postgres");
		} catch (SQLException ex) {
			System.err.println("SQLException: " + ex.getMessage());
		}

	}

       public Connection getConn(){
                if(conn == null)
                  conexao()
                return conn
       }
}

Em todos os servlets no init eu aloco os recurso e pego conexao

e no destroy fecho tudo e aponto os objetos para null ou seja abrindo e fechando a conexao em todos os servlets
Esta é uma boa pratica??? e o melhor jeito...

desde ja agradeco :D :D

13 Respostas

T

Em um projeto WEB, use a conexão obtida via pool de conexões que normalmente um web container ou application server já lhe dá. Normalmente essas conexões devem ser obtidas via JNDI e configuradas pelas ferramentas de administração do web container, mas consulte a documentação do seu web container.
Outra coisa: em projetos WEB, System.err.println normalmente joga os erros em algum local desconhecido. Veja na documentação do seu web container ou application server como é que se usa o log, que é o lugar certo onde devem ficar as mensagens. (Normalmente é usado o Log4J ou então as classes do pacote java.util.logging.)

V

obrigado pela resposta thingol, no caso estou usando Tomcat 6, porem terei que estudar muitas coisas ainda pq eu nao entendi o que é “pool de conexoes” e nem esta parte onde voce falou

mas gradeco a reposta, outras sugestoes serao bem vindas.

eu ja consegui colocar a aplicacao no tomcat, localmete roda corretamente, mas imagino esta aplicacao iteragindo com 100 clientes ou mais.

vlw e obrigado, aceito + sugestoes pessoal t+ =)

G

Mais sobre pool, tomcat e jndi:

http://www.google.com.br/search?hl=pt-BR&q=jndi+tomcat+&btnG=Pesquisa+Google&meta=cr%3DcountryBR&aq=f&oq=

T

Procure aqui no GUJ sobre “pool de conexões”. Basicamente é o seguinte: um servlet normalmente precisa ficar com a conexão com o banco de dados aberta pelo menor tempo possível, até porque ele só precisa fazer algumas consultas rápidas.
Se você ficar abrindo e fechando a conexão toda hora, o banco vai pro espaço, já que ele não suporta isso.
E um servlet também não deve ficar com a conexão aberta direto, já que você não sabe o que vai ocorrer com ele; uma hora (normalmente no primeiro dia, quando o site começar a entrar em produção) vai dar problemas.

E é para isso que serve o tal de “pool de conexões”. Isso é uma biblioteca que cria várias conexões ao banco, e quando você precisa de uma conexão, ele lhe “empresta” uma, e depois você a “devolve” (chamando os métodos “close”).

Procure aqui no GUJ sobre “pool de conexões” ou “connection pool” e Tomcat; isso vai lhe retornar vários resultados.

V

obrigado pela ajuda, estou comecando a entender como funciona. resumindo para comecar

As configurações a seguir devem estar dentro das tags mencionadas acima:

edito meu context.xml la no tomcat

entao no meotdo init do servlet alocarei uma conexao deste modo

InitialContext ctx = new InitialContext(); DataSource db = (DataSource)ctx.lookup("java:comp/env/jdbc/bdteste"); Connection con = db.getConnection();

e no servlet.destoy InitialContext ctx = null DataSource db = null Connection con = null

assim seria uma boa maneira???

obrigado desde já!!!

T

Obter a conexão do pool costuma ser tão rápido, assim como devolvê-la, que você nunca deve ficar com a conexão aberta exceto durante o tempo em que você faz o efetivo processamento.

Portanto você tem de obter a conexão e fechar (devolver) a conexão no tratamento da sua servlet (ou seja, no doGet ou no doPost, não no init ou no destroy.

V

entendi thingol, e somente de eu fechar uma conexao significa que eu estou devolvendo???

ou seja

InitialContext ctx = new InitialContext(); DataSource db = (DataSource)ctx.lookup("java:comp/env/jdbc/bdteste"); Connection con = db.getConnection();
aqui eu peguei “emprestado”

con.close();
e aqui estou “devolvendo??”

T

Sim senhor.

V

thingol muito obrigado pela paciencia, kra =)

entao assim meu pool de conexao estara sendo controlado pelo tomcat, e no tutorial ele diz


maxActive=“8”
define o número máximo de conexões no pool, quando não se deseja especificar um limite, basta utilizar “0”

certo mas isso é recomendado, se eu colocar zero esse pool nao estoura??? ou algo do tipo, no que me devo basear para definir este numero???

desculpa as questoes, mas não é todo dia tenho um professor online :smiley: :smiley: :smiley:

T

Normalmente é bom deixar um limite não muito grande (talvez umas 20), e ir olhando no banco de dados se esse número é suficiente (ou seja, se umas 10 estão ativas ao mesmo tempo, ou até menos), ou se você precisa aumentar esse limite.

V

mas se eu colocar 10, somente 10 usuários poderam usar a minha aplicacao???
desde ja agradeco sua paciencia

T

Como você deve ter percebido, o fato de haver 10 conexões abertas ao mesmo tempo não quer dizer que apenas 10 usuários possam usá-la, até porque a conexão passa a maior parte do tempo sem ser usada por uma servlet, se você só a usar durante o processamento (e é por isso que falei em não usar “init” ou “destroy”. ) 10 conexões podem ser usadas por muitos usuários se eles não estiverem usando consultas muito demoradas. Se você pegar sua aplicação e olhar o banco de dados durante a operação talvez veja que, se você estiver fazendo tudo direitinho, apenas 1 ou 2 conexões estejam sendo usadas ao mesmo tempo, e o resto fique esperando alguma solicitação.

V

muito obrigado thingol, vou comecar a testar e a medida que tenho duvidas vou colocando aqui, vou mudar nome do topico para JNDI para iniciantes pq muita gente deve ter este tipo de duvida tbm, muito obrigado mesmo t+!

Criado 12 de fevereiro de 2009
Ultima resposta 12 de fev. de 2009
Respostas 13
Participantes 3