sobre a explicação detalhada do problema do pool de conexões entre Tomcat e MySQL (original)
e finalmente consegui algo, espero que seja útil para todos. Em primeiro lugar, observe: aqui discutimos especificamente os problemas encontrados na versão Tomcat 5.5. Por que esta versão é particularmente específica, explicarei em um momento.
Pergunta 1: Não é possível criar driver JDBC da classe '' para conectar URL 'nulo'
responder:
[Análise de causa]
Muitos amigos descobriram que o erro acima ocorreu ao chamar o pool de conexões após configurar $Tomcat/conf/server.xml, $Tomcat/conf/context.xml ou mesmo WEB-INF/web.xml. Analisando a causa do erro, geralmente é porque não vinculamos a fonte de dados (a causa real do erro é porque as configurações de driverClassName e url estão vazias, mas definitivamente não esqueceremos de definir este local, então devemos ter concluído as configurações sem conectar!). Geralmente há duas maneiras de configurar a fonte de dados (não apenas o método de configuração em $Tomcat/conf/context.xml). Uma é adicionar o seguinte código antes de </GlobalNamingResources> em $Tomcat/conf/server.xml:
Método de configuração um:
<Recurso
name="jdbc/test" //Nome da fonte de dados
tipo = "javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" //Esta é a configuração de driverClassName que acabei de mencionar
password="admin" //Senha do banco de dados
maxIdle="2"
maxWait="5000"
nomedeusuario="root" //Nome de usuário do banco de dados
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //URL do banco de dados, que é o URL que acabamos de mencionar
maxActive="4"/>
Exceto onde há comentários, todos os parâmetros são usados para definir o número de conexões, status inativo e status de atividade. Se você estiver apenas fazendo um experimento de aprendizado, não será necessário alterá-lo. O efeito deste método é equivalente à configuração de operações na interface gráfica do Tomcat.
Outra maneira é adicionar o seguinte código a <Context ...></Context> em $Tomcat/conf/server.xml:
Método de configuração dois:
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/teste">
<parâmetro>
<nome>fábrica</nome>
<valor>org.apache.commons.dbcp.BasicDataSourceFactory</valor>
</parametro>
<parâmetro>
<nome>nome de usuário</nome>
<valor>raiz</valor>
</parametro>
<parâmetro>
<nome>senha</nome>
<value>administrador</value>
</parametro>
<parâmetro>
<name>driverClassName</name>
<valor>com.mysql.jdbc.Driver</valor>
</parametro>
<parâmetro>
<nome>URL</nome>
<valor>jdbc:mysql://localhost:3306/test?autoReconnect=true</valor>
</parametro>
<parâmetro>
<name>tamanhoinicial</name>
<valor>20</valor>
</parametro>
<parâmetro>
<name>maxAtivo</name>
<valor>30</valor>
</parametro>
<parâmetro>
<nome>maxWait</nome>
<valor>10.000</valor>
</parametro>
</ResourceParams>
O objetivo usual desta configuração é permitir que a fonte de dados seja implementada em um diretório de mapeamento separado, ou seja, normalmente esse código aparece em <Context docBase="diretório específico (como D:webappsmyjsp) " path= "Nome de acesso (como /myjsp)" reloadable="true"></Context>, para que você possa acessar um arquivo em D:webappsmyjsp acessando http://localhost:8080/myjsp/ XXX.jsp A página jsp recupera a origem de dados ou executa outras operações para recuperar a origem de dados.
O problema é que não importa o método, ninguém está conectado! Se você não usar o ResourceLink, o bean ou bean não será capaz de encontrar o código que você definiu. Como você pode encontrar o driverClassName e o URL? Na verdade, nenhuma das configurações dos parâmetros será encontrada!
[Solução]
Depois de saber o motivo, a solução será mais fácil. Não importa qual método você use.
Solução um:
Se você deseja implementar o ResourceLink em um diretório de mapeamento, adicione <ResourceLink global="data source name" name="mapped name" type="javax.sql.DataSource" no meio de <Context...></Context> "/>, observe que se você não entender o relacionamento do código, deverá escrevê-lo logo após <Contexto...>.
Solução dois:
Se você quiser torná-lo global e utilizável em todos os diretórios de mapeamento, basta escrevê-lo em $Tomcat/conf/context.xml e tudo ficará bem.
Geralmente, todos definem o "nome da fonte de dados" e o "nome mapeado" como iguais. Por exemplo, eu defino assim: <ResourceLink global="jdbc/test" name="jdbc/test" type="javax. sql.DataSource" "/>.
Além disso, deve-se observar que no Tomcat5.5, se você configurar o segundo método acima, mesmo se adicionar o ResourceLink, encontrará o problema de não funcionar corretamente.
Pergunta 2: javax.naming.NameNotFoundException: o nome XXX não está vinculado neste contexto
responder:
[Análise de causa]
No Tomcat5.5, definir a fonte de dados em <Context...><Context> não funciona corretamente. Li uma postagem escrita por um estrangeiro. Meu nível de inglês não é alto, mas consigo entendê-lo. Ele disse que isso ocorre porque em versões superiores (deveria ser Tomcat e dbcp), o valor de fábrica foi alterado de org.apache.commons.dbcp.BasicDataSourceFactory para org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory. Mas tentei e não resolveu o problema. E descobri que a versão padrão do Tomcat5.5 vem com dbcp, que está em $Tomcatcommonlib. Li a explicação de outro internauta e ele disse que o segundo método de configuração não é possível. Isso mostra que o segundo método de configuração só é aplicável a versões anteriores. Não sei qual parte fazer alterações na versão atual, mas o motivo do erro é que quero configurá-lo em conjunto e o servidor não consegue encontrar. a fonte de dados correspondente ao "nome da fonte de dados".
[Solução]
Você pode resolver isso se souber o motivo. Parece que só funciona se a fonte de dados for declarada em <GlobalNamingResources>. Assim, todos podem configurar o Tomcat5.5 de acordo com o primeiro método de configuração (é por isso que falo sobre o Tomcat5.5 em particular).
Pergunta 3: Não é possível carregar a classe do driver JDBC 'com.mysql.jdbc.Driver'
responder:
[Análise de causa]
Não apenas para mysql, mas também para outros bancos de dados, desde que não seja encontrado, este erro "Não é possível carregar a classe do driver JDBC" será lançado. Então, por que a classe do driver do banco de dados não pode ser encontrada? Como encontrá-lo? Na verdade, é muito simples.
[Solução]
Basta copiar o jdbc para $Tomcatcommonlib.
Pergunta 4: Não é possível obter uma conexão, pool esgotado
[Análise de causa]
É muito simples. A conexão não pode ser estabelecida e o pool de conexões transborda. Isso significa que seus recursos de conexão foram desperdiçados porque você não os reciclou a tempo.
[Solução]
Use o método close() imediata e corretamente para liberar ResultSet, Statement e Connection. Não entrarei nas instruções específicas. É recomendável escrevê-los finalmente.
Resumo: Portanto, se você quiser usar o Tomcat5.5 para estabelecer um pool de conexões de origem de dados, há apenas três etapas.
Primeiro: Defina a fonte de dados. É recomendado usar a interface gráfica de operação. Se você fizer isso manualmente, adicione o seguinte código antes de </GlobalNamingResources> em $Tomcat/conf/server.xml:
<Resource.
name="jdbc/test" //Nome da fonte de dados
tipo = "javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" //Esta é a configuração de driverClassName que acabei de mencionar
password="admin" //Senha do banco de dados
maxIdle="2"
maxWait="5000"
nomedeusuario="root" //Nome de usuário do banco de dados
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //URL do banco de dados, que é o URL que acabamos de mencionar
maxActive="4"/>
para os seus próprios.
Segundo: Configure a conexão de recursos. Recomenda-se escrever <ResourceLink global="data source name" name="mapped name" type="javax.sql.DataSource"/> em $Tomcat/conf/context.xml se desejar mapeá-lo em um separado. A implementação do diretório é escrita após <Context...> no diretório que precisa ser mapeado em $Tomcat/conf/server.xml.
Terceiro: Copie JDBC para $Tomcatcommonlib.
Além disso, não explicarei em detalhes como chamar a fonte de dados aqui. Este problema é relativamente simples, mas observe que DataSource ds=(DataSource)envCtx.lookup(" Fonte de dados de referência "); A "fonte de dados referenciada" na instrução é apenas o "nome mapeado", não o "nome da fonte de dados", então sugiro que você defina os dois nomes como iguais por conveniência. E preste atenção especial à liberação de recursos ociosos a tempo, caso contrário, o pool de conexões transbordará!
Os itens acima são alguns resultados de minha pesquisa hoje. Ainda sou um iniciante, espero que este artigo seja útil para todos. Se você tiver alguma dúvida, entre em contato comigo. Meu e-mail é: [email protected] (pessoas que adoram ver luzes de néon). Este artigo é original de neonlight.bokee.com (CSDN_MathMagician) e não pode ser reproduzido! 11 de agosto de 2006
http://blog.csdn.net/mathmagician/archive/2007/03/01/1518689.aspx