sur l'explication détaillée du problème du pool de connexions entre Tomcat et MySQL (original)
et j'ai finalement obtenu quelque chose, j'espère que cela sera utile à tout le monde. Tout d'abord, attention : nous abordons ici spécifiquement les problèmes rencontrés dans la version Tomcat 5.5. Pourquoi cette version est particulièrement spécifique, je l'expliquerai dans un instant.
Question 1 : Impossible de créer un pilote JDBC de classe « » pour l'URL de connexion « nulle »
répondre:
[Analyse des causes]
De nombreux amis ont découvert que l'erreur ci-dessus s'est produite lors de l'appel du pool de connexions après avoir configuré $Tomcat/conf/server.xml, $Tomcat/conf/context.xml ou même WEB-INF/web.xml. En analysant la cause de l'erreur, c'est généralement parce que nous n'avons pas lié la source de données (la cause réelle de l'erreur est que les paramètres de driverClassName et url sont vides, mais nous n'oublierons certainement pas de définir cet endroit, nous devons donc avez terminé les réglages sans vous connecter !). Il existe généralement deux manières de configurer la source de données (pas seulement la méthode de configuration dans $Tomcat/conf/context.xml). La première consiste à ajouter le code suivant avant </GlobalNamingResources> dans $Tomcat/conf/server.xml :
Première méthode de réglage :
<Ressource
name="jdbc/test" //Nom de la source de données
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" //C'est le paramètre de driverClassName que je viens de mentionner
password="admin" //Mot de passe de la base de données
maxIdle="2"
maxWait="5000"
username="root" //Nom d'utilisateur de la base de données
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //URL de la base de données, qui est l'URL qui vient d'être mentionnée
maxActive="4"/>
Sauf là où il y a des commentaires, tous les paramètres sont utilisés pour définir le nombre de connexions, l'état d'inactivité et l'état d'activité. Si vous faites simplement une expérience d'apprentissage, vous n'avez pas besoin de le modifier. L'effet de cette méthode équivaut à la configuration des opérations dans l'interface graphique Tomcat.
Une autre façon consiste à ajouter le code suivant à <Context ...></Context> dans $Tomcat/conf/server.xml :
Deuxième méthode de réglage :
<Nom de la ressource="jdbc/test" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams nom="jdbc/test">
<paramètre>
<nom>usine</nom>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</paramètre>
<paramètre>
<nom>nom d'utilisateur</nom>
<valeur>racine</valeur>
</paramètre>
<paramètre>
<nom>mot de passe</nom>
<value>admin</value>
</paramètre>
<paramètre>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</paramètre>
<paramètre>
<nom>url</nom>
<value>jdbc:mysql://localhost:3306/test?autoReconnect=true</value>
</paramètre>
<paramètre>
<nom>tailleinitiale</nom>
<valeur>20</valeur>
</paramètre>
<paramètre>
<nom>maxActive</nom>
<valeur>30</valeur>
</paramètre>
<paramètre>
<nom>maxWait</nom>
<valeur>10 000</valeur>
</paramètre>
</ResourceParams>
L'objectif habituel de ce paramètre est de permettre à la source de données d'être implémentée dans un répertoire de mappage distinct, c'est-à-dire que ce code apparaît généralement dans le <Context docBase="répertoire spécifique (tel que D:webappsmyjsp) " path= "Nom d'accès (tel que /myjsp)" reloadable="true"></Context>, afin que vous puissiez accéder à un fichier dans D:webappsmyjsp en accédant à http://localhost:8080/myjsp/ XXX.jsp La page jsp récupère ensuite la source de données ou effectue d'autres opérations pour récupérer la source de données.
Le problème est que, quelle que soit la méthode utilisée, personne n’est connecté ! Si vous n'utilisez pas ResourceLink, le bean ou le bean ne pourra pas trouver le code que vous avez défini. Comment trouver le driverClassName et l'URL ? En fait, aucun des réglages de paramètres ne sera retrouvé !
[Solution]
Une fois que vous connaîtrez la raison, la solution sera plus facile. Quelle que soit la méthode que vous utilisez.
Première solution :
Si vous souhaitez implémenter ResourceLink dans un répertoire de mappage, ajoutez <ResourceLink global="data source name" name="mapped name" type="javax.sql.DataSource" au milieu de <Context...></Context> "/>, veuillez noter que si vous ne comprenez pas la relation entre le code, vous devez l'écrire de près après <Context...>.
Deuxième solution :
Si vous souhaitez le rendre global et utilisable dans tous les répertoires de mappage, écrivez-le simplement dans $Tomcat/conf/context.xml et tout ira bien.
Généralement, tout le monde définit le « nom de la source de données » et le « nom mappé » pour qu'ils soient identiques. Par exemple, je l'ai défini comme ceci : <ResourceLink global="jdbc/test" name="jdbc/test" type="javax. sql.DataSource" "/>.
De plus, il faut noter que dans Tomcat5.5, si vous configurez la deuxième méthode ci-dessus, même si vous ajoutez ResourceLink, vous rencontrerez le problème de ne pas fonctionner correctement.
Question 2 : javax.naming.NameNotFoundException : le nom XXX n'est pas lié dans ce contexte
répondre:
[Analyse des causes]
Dans Tomcat5.5, la définition de la source de données dans <Context...><Context> ne fonctionne pas correctement. J'ai lu un article écrit par un étranger. Mon niveau d'anglais n'est pas élevé, mais je peux simplement le comprendre. Il a expliqué que cela était dû au fait que dans les versions supérieures (devraient être Tomcat et dbcp), la valeur de factory avait été modifiée de org.apache.commons.dbcp.BasicDataSourceFactory à org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory. Mais je l'ai essayé et cela n'a pas résolu le problème. Et j'ai découvert que la version standard de Tomcat5.5 est livrée avec dbcp, qui se trouve dans $Tomcatcommonlib. J'ai lu l'explication d'un autre internaute, et il a dit que la deuxième méthode de réglage n'était pas possible. Cela montre que la deuxième méthode de configuration n'est applicable qu'aux versions précédentes. Je ne sais pas quelle partie apporter des modifications dans la version actuelle, mais la raison de l'erreur est que je souhaite la configurer ensemble et que le serveur ne trouve pas. la source de données correspondant au "nom de la source de données".
[Solution]
Vous pouvez le résoudre si vous connaissez la raison. Il semble que cela ne fonctionne que si la source de données est déclarée dans <GlobalNamingResources>. Ainsi tout le monde peut paramétrer Tomcat5.5 selon la première méthode de paramétrage (c'est pourquoi je parle notamment de Tomcat5.5).
Question 3 : Impossible de charger la classe de pilote JDBC 'com.mysql.jdbc.Driver'
répondre:
[Analyse des causes]
Non seulement pour MySQL, mais aussi pour d'autres bases de données, tant qu'elle ne peut pas être trouvée, cette erreur « Impossible de charger la classe du pilote JDBC » sera générée. Alors pourquoi la classe du pilote de base de données ne peut-elle pas être trouvée ? Comment le trouver ? C'est en fait très simple.
[Solution]
Copiez simplement jdbc dans $Tomcatcommonlib.
Question 4 : Impossible d'obtenir une connexion, pool épuisé
[Analyse des causes]
C'est très simple. La connexion ne peut pas être établie et le pool de connexions déborde. Cela signifie que vos ressources de connexion sont gaspillées car vous ne les avez pas recyclées à temps.
[Solution]
Utilisez la méthode close() rapidement et correctement pour publier ResultSet, Statement et Connection. Je n'entrerai pas dans les instructions spécifiques, il est recommandé de les écrire enfin.
Résumé : Ainsi, si vous souhaitez utiliser Tomcat5.5 pour établir un pool de connexions à une source de données, il n'y a que trois étapes.
Premièrement : définissez la source de données. Il est recommandé d'utiliser l'interface d'opération graphique. Si vous le faites manuellement, ajoutez le code suivant avant </GlobalNamingResources> dans $Tomcat/conf/server.xml :
<Resource.
name="jdbc/test" //Nom de la source de données
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver" //C'est le paramètre de driverClassName que je viens de mentionner
password="admin" //Mot de passe de la base de données
maxIdle="2"
maxWait="5000"
username="root" //Nom d'utilisateur de la base de données
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //URL de la base de données, qui est l'URL qui vient d'être mentionnée
maxActive="4"/>
par les vôtres.
Deuxièmement : configurez la connexion aux ressources. Il est recommandé d'écrire <ResourceLink global="data source name" name="mapped name" type="javax.sql.DataSource"/> dans $Tomcat/conf/context.xml si vous souhaitez le mapper dans un fichier séparé. L'implémentation du répertoire est écrite après <Context...> dans le répertoire qui doit être mappé dans $Tomcat/conf/server.xml.
Troisièmement : copiez JDBC dans $Tomcatcommonlib.
De plus, je n'expliquerai pas en détail comment appeler la source de données ici. Ce problème est relativement simple, mais veuillez noter que DataSource ds=(DataSource)envCtx.lookup(" Source de données de référence "); La "source de données référencée" dans l'instruction est uniquement le "nom mappé", pas le "nom de la source de données", je vous suggère donc de définir les deux noms pour qu'ils soient identiques pour plus de commodité. Et faites particulièrement attention à libérer les ressources inutilisées à temps, sinon le pool de connexions débordera !
Voici quelques résultats de mes recherches aujourd’hui. Je suis encore un débutant et j’espère que cet article sera utile à tout le monde. Si vous avez des questions, n'hésitez pas à me contacter. Mon email est : [email protected] (les gens qui aiment voir les néons). Cet article est original sur neonlight.bokee.com (CSDN_MathMagician) et ne peut pas être reproduit ! 11 août 2006
http://blog.csdn.net/mathmagician/archive/2007/03/01/1518689.aspx