nach der detaillierten Erklärung des Verbindungspoolproblems zwischen Tomcat und MySQL (Original)
gesuchtund hoffe, dass es für alle hilfreich ist. Bitte beachten Sie zunächst: Hier gehen wir speziell auf die Probleme ein, die in der Tomcat 5.5-Version aufgetreten sind. Warum diese Version besonders spezifisch ist, werde ich gleich erläutern.
Frage 1: JDBC-Treiber der Klasse '' kann nicht für die Verbindungs-URL „null“ erstellt werden.
Antwort:
[Ursachenanalyse]
Viele Freunde stellten fest, dass der obige Fehler beim Aufrufen des Verbindungspools nach der Konfiguration von $Tomcat/conf/server.xml, $Tomcat/conf/context.xml oder sogar WEB-INF/web.xml auftrat. Bei der Analyse der Fehlerursache liegt es im Allgemeinen daran, dass wir die Datenquelle nicht gebunden haben (die eigentliche Fehlerursache liegt darin, dass die Einstellungen von DriverClassName und URL leer sind, aber wir werden auf keinen Fall vergessen, diesen Ort festzulegen, also müssen wir Ich habe die Einstellungen ohne Verbindung abgeschlossen!). Normalerweise gibt es zwei Möglichkeiten, die Datenquelle zu konfigurieren (nicht nur die Einstellungsmethode in $Tomcat/conf/context.xml). Eine besteht darin, den folgenden Code vor </GlobalNamingResources> in $Tomcat/conf/server.xml hinzuzufügen:
Einstellungsmethode eins:
<Ressource
name="jdbc/test" //Datenquellenname
type="javax.sql.DataSource"
DriverClassName="com.mysql.jdbc.Driver" //Dies ist die Einstellung von DriverClassName, die ich gerade erwähnt habe
passwort="admin" //Datenbankpasswort
maxIdle="2"
maxWait="5000"
username="root" //Datenbankbenutzername
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //Datenbank-URL, die gerade erwähnte URL
maxActive="4"/>
Außer bei Kommentaren werden alle Parameter zum Festlegen der Anzahl der Verbindungen, des Ruhezustands und des Aktivitätsstatus verwendet. Wenn Sie nur ein Lernexperiment durchführen, müssen Sie diese nicht ändern. Die Wirkung dieser Methode entspricht der Konfiguration von Vorgängen in der grafischen Oberfläche von Tomcat.
Eine andere Möglichkeit besteht darin, den folgenden Code zu <Context ...></Context> in $Tomcat/conf/server.xml hinzuzufügen:
Einstellungsmethode zwei:
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/test">
<Parameter>
<name>Fabrik</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<Parameter>
<name>Benutzername</name>
<value>root</value>
</parameter>
<Parameter>
<name>Passwort</name>
<value>admin</value>
</parameter>
<Parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<Parameter>
<name>URL</name>
<value>jdbc:mysql://localhost:3306/test?autoReconnect=true</value>
</parameter>
<Parameter>
<name>initialSize</name>
<Wert>20</Wert>
</parameter>
<Parameter>
<name>maxActive</name>
<Wert>30</Wert>
</parameter>
<Parameter>
<name>maxWait</name>
<Wert>10000</Wert>
</parameter>
</ResourceParams>
Der übliche Zweck dieser Einstellung besteht darin, die Implementierung der Datenquelle in einem separaten Zuordnungsverzeichnis zu ermöglichen, d. h. normalerweise erscheint dieser Code in einem <Context docBase="spezifischen Verzeichnis (z. B. D:webappsmyjsp). " path= "Zugriffsname (z. B. /myjsp)" reloadable="true"></Context>, damit Sie auf eine Datei in D:webappsmyjsp zugreifen können, indem Sie auf http://localhost:8080/myjsp/ zugreifen. XXX.jsp Die JSP-Seite ruft dann die Datenquelle ab oder führt andere Vorgänge aus, um die Datenquelle abzurufen.
Das Problem ist, egal welche Methode, niemand ist verbunden! Wenn Sie ResourceLink nicht verwenden, kann die Bean oder Bean den von Ihnen festgelegten Code nicht finden. Wie können Sie den Treiberklassennamen und die URL finden? Tatsächlich wird keine der Parametereinstellungen gefunden!
[Lösung]
Sobald Sie den Grund kennen, wird die Lösung einfacher sein. Egal welche Methode Sie verwenden.
Lösung eins:
Wenn Sie ResourceLink in einem Zuordnungsverzeichnis implementieren möchten, fügen Sie <ResourceLink global="data source name" name="mapped name" type="javax.sql.DataSource" in der Mitte von <Context...></Context> hinzu "/>, bitte beachten Sie, dass Sie, wenn Sie die Codebeziehung nicht verstehen, sie direkt nach <Context...> schreiben müssen.
Lösung zwei:
Wenn Sie es global und in allen Mapping-Verzeichnissen nutzbar machen möchten, schreiben Sie es einfach in $Tomcat/conf/context.xml und alles wird in Ordnung sein.
Im Allgemeinen legen alle den „Datenquellennamen“ und den „zugeordneten Namen“ auf den gleichen Wert fest. Ich habe ihn beispielsweise so eingestellt: <ResourceLink global="jdbc/test" name="jdbc/test" type="javax. sql.DataSource" "/>.
Darüber hinaus muss beachtet werden, dass in Tomcat5.5 beim Einrichten der zweiten Methode oben auch beim Hinzufügen von ResourceLink das Problem auftritt, dass es nicht ordnungsgemäß ausgeführt wird.
Frage 2: javax.naming.NameNotFoundException: Name XXX ist in diesem Kontext nicht gebunden
Antwort:
[Ursachenanalyse]
In Tomcat5.5 funktioniert das Festlegen der Datenquelle in <Context...><Context> nicht richtig. Ich habe einen Beitrag gelesen, der von einem Ausländer geschrieben wurde, aber ich kann ihn gerade noch verstehen. Er sagte, das liege daran, dass in höheren Versionen (sollten Tomcat und dbcp sein) der Wert von „factory“ von org.apache.commons.dbcp.BasicDataSourceFactory in org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory geändert wurde. Aber ich habe es versucht und es hat das Problem nicht gelöst. Und ich habe festgestellt, dass die Standardversion von Tomcat5.5 mit dbcp geliefert wird, das sich in $Tomcatcommonlib befindet. Ich habe die Erklärung eines anderen Internetnutzers gelesen und er sagte, dass die zweite Einstellungsmethode nicht möglich sei. Dies zeigt, dass die zweite Einstellungsmethode nur auf frühere Versionen anwendbar ist. Ich weiß nicht, welchen Teil ich in der aktuellen Version ändern soll, aber der Grund für den Fehler ist, dass ich ihn zusammen einrichten möchte und der Server ihn nicht finden kann die Datenquelle, die dem „Datenquellennamen“ entspricht.
[Lösung]
Sie können es lösen, wenn Sie den Grund kennen. Es scheint, dass es nur funktioniert, wenn die Datenquelle in <GlobalNamingResources> deklariert ist. Somit kann jeder Tomcat5.5 gemäß der ersten Einstellungsmethode einrichten (aus diesem Grund spreche ich insbesondere von Tomcat5.5).
Frage 3: Die JDBC-Treiberklasse „com.mysql.jdbc.Driver“ kann nicht geladen werden.
Antwort:
[Ursachenanalyse]
Nicht nur für MySQL, sondern auch für andere Datenbanken wird der Fehler „JDBC-Treiberklasse kann nicht geladen werden“ ausgegeben. Warum kann die Datenbanktreiberklasse nicht gefunden werden? Wie finde ich es? Es ist eigentlich ganz einfach.
[Lösung]
Kopieren Sie jdbc einfach nach $Tomcatcommonlib.
Frage 4: Es kann keine Verbindung hergestellt werden, der Pool ist erschöpft
[Ursachenanalyse]
Es ist ganz einfach. Die Verbindung kann nicht hergestellt werden und der Verbindungspool läuft über. Das bedeutet, dass Ihre Verbindungsressourcen verschwendet werden, weil Sie sie nicht rechtzeitig recycelt haben.
[Lösung]
Verwenden Sie die Methode close() umgehend und korrekt, um ResultSet, Statement und Connection freizugeben. Ich werde nicht auf die spezifischen Anweisungen eingehen.
Zusammenfassung: Wenn Sie also Tomcat5.5 zum Einrichten eines Datenquellen-Verbindungspools verwenden möchten, sind nur drei Schritte erforderlich.
Erstens: Legen Sie die Datenquelle fest. Wenn Sie dies manuell tun, fügen Sie den folgenden Code vor </GlobalNamingResources> in $Tomcat/conf/server.xml hinzu:
<Resource
name="jdbc/test" //Datenquellenname
type="javax.sql.DataSource"
DriverClassName="com.mysql.jdbc.Driver" //Dies ist die Einstellung von DriverClassName, die ich gerade erwähnt habe
passwort="admin" //Datenbankpasswort
maxIdle="2"
maxWait="5000"
username="root" //Datenbankbenutzername
url="jdbc:mysql://localhost:3306/test?autoReconnect=true" //Datenbank-URL, die gerade erwähnte URL
, die Kommentarparameter
maxActive="4"/>
in Ihre eigenen zu ändern.Zweitens: Ressourcenverbindung einrichten. Es wird empfohlen, <ResourceLink global="data source name" name="mapped name" type="javax.sql.DataSource"/> in $Tomcat/conf/context.xml zu schreiben, wenn Sie es separat zuordnen möchten Die Verzeichnisimplementierung wird nach <Context...> in das Verzeichnis geschrieben, das in $Tomcat/conf/server.xml zugeordnet werden muss.
Drittens: Kopieren Sie JDBC nach $Tomcatcommonlib.
Außerdem werde ich hier nicht im Detail erklären, wie die Datenquelle aufgerufen wird, aber bitte beachten Sie, dass DataSource ds=(DataSource)envCtx.lookup(" Referenzdatenquelle „); Die „referenzierte Datenquelle“ in der Anweisung ist nur der „zugeordnete Name“, nicht der „Datenquellenname“, daher schlage ich vor, dass Sie der Einfachheit halber die beiden Namen gleich festlegen. Achten Sie besonders darauf, ungenutzte Ressourcen rechtzeitig freizugeben, da sonst der Verbindungspool überläuft!
Das Obige sind einige Ergebnisse meiner heutigen Recherche. Ich hoffe, dieser Artikel wird für alle hilfreich sein. Wenn Sie Fragen haben, kontaktieren Sie mich bitte. Meine E-Mail lautet: [email protected] (Leute, die gerne Neonlichter sehen). Dieser Artikel stammt ursprünglich von neonlight.bokee.com (CSDN_MathMagician) und kann nicht reproduziert werden! 11. August 2006
http://blog.csdn.net/mathmagician/archive/2007/03/01/1518689.aspx