Melhor Performance

9 respostas
W

Gostaria de que alguem me desse uma boa ajuda de vcs…
Estou desenvolvendo uma aplicação usando MVC aplicando ao
padrão de projetos Command. Pra fazer conexão com o banco de dados (interbase), implementei uma classe só pra carregar um objeto BasicDataSource (tô usando o pacote
commons-dbcp-1.2.1.jar da jakarta) pra fazer um pool de conexões. Só que ao fazer a implementação, percebi
que o acesso aos modelos por parte do controlador ficou
mais lento do que antes,
quando usava a chamada direta ao driver e iniciava a
conexão com DriverManager.getConnection(url, user, password). Detalhe: as informações de driver usado e endereço do banco de dados estão em variáveis de contexto em web.xml (mas não creio que seja isso) . Pra tentar
melhorar a performance coloquei a classe no método
init do Servlet(pra ser instanciada uma só vez) e passei
ela como atributo de sessão pra poder ser vista pelo modelo. Ainda assim a chamada aos modelos continua uma carroça! Alguem tem idéia de uma implementação melhor? (Não tou usando Struts ainda; se estivesse nem estaria escrevendo…)

:???:
WagnerFull

“Feliz a nação cujo Deus é o Senhor”

9 Respostas

M

a lerdeza ta no DataSource? … tu q ta implementando esse pool? pq não usa o DataSource direto das configurações do Tomcat? (se é q estas usando o Tomcat como container hehe) :roll:

W

A lerdeza ainda está no datasource…
Bem, como disse anteriormente, estou instanciando uma classe que carrega o dataSource(tou fazendo na mão).

O Netbeans usa o tomcat pra fazer testes, estou testando nele… Como fazer pra configurar com ele? tem algum tutorial a respeito disso?

J

“WagnerFull”:
A lerdeza ainda está no datasource…
Bem, como disse anteriormente, estou instanciando uma classe que carrega o dataSource(tou fazendo na mão).

A classe que contem o DataSource é um singleton ou um monostate da vida? Se vc recriar o DataSource cada vez que acessar o seu modelo, a performance será horrivel mesmo.

valeuz…

M

pra ti fazer um pool de conexões com o tomcat (5), faça o seguinte, edite o arquivo server.xml, em <GlobalNamingResources>, tu insere o seguinte:

&lt;Resource name=&quot;jdbc/PostgresDS&quot;  auth=&quot;Container&quot; type=&quot;javax.sql.DataSource&quot; /&gt;
	&lt;ResourceParams name=&quot;jdbc/PostgresDS&quot;&gt;
	
		&lt;parameter&gt;&lt;name&gt;factory&lt;/name&gt;&lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;&lt;/parameter&gt;		
		&lt;parameter&gt;&lt;name&gt;driverClassName&lt;/name&gt;&lt;value&gt;org.postgresql.Driver&lt;/value&gt;&lt;/parameter&gt;
		&lt;parameter&gt;&lt;name&gt;url&lt;/name&gt;&lt;value&gt;jdbc&#58;postgresql&#58;//127.0.0.1&#58;5432/nomeDoBanco&lt;/value&gt;&lt;/parameter&gt;
		
		&lt;parameter&gt;&lt;name&gt;username&lt;/name&gt;&lt;value&gt;usuaio&lt;/value&gt;&lt;/parameter&gt;
		&lt;parameter&gt;&lt;name&gt;password&lt;/name&gt;&lt;value&gt;senha&lt;/value&gt;&lt;/parameter&gt;		
		&lt;parameter&gt;&lt;name&gt;maxActive&lt;/name&gt;&lt;value&gt;20&lt;/value&gt;&lt;/parameter&gt;		
		&lt;parameter&gt;&lt;name&gt;maxIdle&lt;/name&gt;&lt;value&gt;10&lt;/value&gt;&lt;/parameter&gt;				
		&lt;parameter&gt;&lt;name&gt;maxWait&lt;/name&gt;&lt;value&gt;100&lt;/value&gt;&lt;/parameter&gt;				
		
	&lt;/ResourceParams&gt;

nesse caso, estou usando uma configuração pra postgresql, altere com a sua, e no teu código, tu acha o DataSource assim:

InitialContext context = new InitialContext&#40;&#41;;
Context ctx = &#40; Context &#41; context.lookup&#40; &quot;java&#58;comp/env/&quot; &#41;;
dataSource = &#40; javax.sql.DataSource &#41; ctx.lookup&#40; &quot;jdbc/PostgresDS&quot; &#41;;

lembrando, q o nome "jdbc/PostgresDS" é o mesmo em <ResourceParams name="jdbc/PostgresDS">, é só alterar pro q tu quiser, ai é só tu dar um dataSource.getConnection() q recebe uma conexão do pool, pra devolver, nao se esqueça de chamar close()

W

(jack)A classe é instanciada uma única vez pelo método init do servlet , mas é passada como parâmetro de sessão para os modelos…

Eu usei “interbase” no lugar de “jdbc/PostgresDS”
e editei o arquivo server.xml em jakarta-tomcat-5.0.19/conf .
TEntei,meu amigo Moderador… mas sinto que algo tá faltando , pois a msg que deu é essa:

Name interbase is not bound in this Context

Durante as tentativas, tentei aplicar tb ao JBoss , só que o erro foi maior ainda… Alguma ajuda pra eu? Agradeço

WagnerFull

“Não temas; de agora em diante serás pescador de homens”(Lc 5:10b)

M

meu amigo moderador é boa heahaeh, parece nome de filme hahahaha, bem, se quiser, pode postar ai teu xml e teu código de lookup, ou… o erro q o JBoss retorna… :slight_smile:

W

Pois é !!! :grin:

W

Quebrando cabeça hoje de manhã, descobri que o erro ocorria pelo fato de que a configuração de arquivo de contexto não era server.xml . O NetBeans cria um arquivo .xml com o nome da aplicação no momento de sua criação e no meu caso(sgi é o nome do contexto da aplicação) ficou assim:

C:\Documents and Settings\Administrador.netbeans\3.6\jakarta-tomcat-5.0.19_base\conf\Catalina\localhost\sgi.xml

Corrija-me se estiver errado, esse parâmetro pode ser mudado no momento de implantação do aplicativo final, mudando apenas o valor da variável CATALINA_BASE do container, não sei se apenas exportar o arquivo WAR para a pasta deploy do JBoss adianta(ainda vou testar).

A chamada no modelo ficou assim:

Context ctx = new InitialContext();
javax.sql.DataSource ds1 = (javax.sql.DataSource) ctx.lookup( “java:comp/env/jdbc/interbase” );

lembrando de importar javax.naming.*

Percebi assim , que chamadas à base de dados ficou uma “bala”, viajei!!!

WagnerFull :lol:

“Quem tem ouvidos ouça o que o Espírito diz às Igrejas”(Ap 3:22)

S

Assim como o Wagner eu tambem to usando NetBeans. Acho que editei o arquivo certo… Alias, eu fiz isso usando um admin que tem na página do jakarta que cria um monte de coisa, inclusive o DataSource.

Ficou assim:

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;Context
    docBase="ROOT/Votorantin/web"
    privileged="true"&gt;
  &lt;Resource
    name="DataSource"
    type="javax.sql.DataSource"
    password="XxXxXx"
    driverClassName="org.postgresql.Driver"
    maxIdle="2"
    maxWait="5000"
    username="strelow"
    url="jdbc&#58;postgresql&#58;//localhost/testebd"
    maxActive="4"/&gt;
  &lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt;
  &lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt;
&lt;/Context&gt;

Isso ta correto né? Como eu chamo no meu programa agora?

Não entendi como ele disse que chamou isso?

Outra coisa é o “maxWait”, o que é isso?

Abraços.

Criado 9 de julho de 2004
Ultima resposta 28 de jun. de 2005
Respostas 9
Participantes 4