Vor kurzem habe ich gelernt, MyBatis zu testen, und es gab kein Problem mit dem Hinzufügen, Löschen, Ändern und Überprüfen allein. Schließlich fand ich bei der Verwendung des MVN -Tests mehrere Probleme:
1. Update ist fehlgeschlagen, da die Datenbank verkleidet ist
2. Wählen Sie Warten aus, da der Verbindungsverbindungspool aufgebraucht ist und warten muss
erhalten:
1. Sei mutig zu erkunden, und Beharrlichkeit ist der Sieg. Als ich den Fehler zum ersten Mal sah, war ich verwirrt, weil ich den Fehler überhaupt nicht sehen konnte. Es war ein im Rahmen gemeldeter Fehler. Ich zögerte, ob ich direkt schlafen sollte
Ich fühle es schließlich, es ist fast 12 Uhr. Schließlich fand ich das Problem ein wenig.
2. Wie oben müssen Sie es wagen, sich in Codes zu befassen, die Sie nicht verstehen und um Codes zu studieren, die Sie nicht verstehen.
3. Wenn Sie immer weiter von einem qualifizierten Coder entfernt sind, denn je mehr Sie lernen, desto mehr spüren Sie die Lücken und Ihr Code ist voller Fallstricke. Nehmen Sie es also unbedingt auf.
Die folgenden Aufzeichnungen dieser beiden Ausgaben.
1. Mysql Datenbank Deadlock
Hier fand ich die Antwort fand die Antwort, hier dank http://www.cnblogs.com/lin-xuan/p/5280614.html. Hier werde ich es neu erstellen:
Die Datenbank -Deadlock ist ein häufiges Problem, das durch Transaktionsdatenbanken (wie SQL Server, MySQL usw.) gestoßen wird. Sofern das Datenbank -Deadlock -Problem nicht häufig auftritt und der Benutzer nicht arbeiten kann, ist das Datenbank -Deadlock -Problem im Allgemeinen nicht schwerwiegend. Versuchen Sie es einfach in der Anwendung. Wie treten Daten -Deadlock auf?
InnoDB implementiert Zeilenpegelschlösser, die in gemeinsame Sperren (en) und Mutex -Sperren (x) unterteilt sind.
• Shared Lock wird für die Transaktionslesezeile verwendet.
• Mutex wird für die Transaktionsaktualisierung oder das Löschen einer Zeile verwendet.
Wenn der Client A die freigegebenen Sperre hält und den Mutex X anfordert; Gleichzeitig hält Client B das Mutex X und fordert die gemeinsame Sperre S. in der obigen Situation ein Datenbank -Deadlock auf. Wenn es nicht klar genug ist, lesen Sie bitte das Beispiel unten.
Doppelte Eröffnung zwei MySQL -Kunden
Kunde a:
Schalten Sie die Transaktion ein und sperren Sie die gemeinsam genutzten Sperre, wenn ID = 12:
MySQL> Start-Transaktion; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) MySQL> SELECT * Aus dem Blog, wobei ID = 12 Lock im Share-Modus sperren;+----+-------+-----------+| id | Name | Author_id |+----+-------+-----------+| 12 | Testa | 50 |+----+-------+-----------+1 Zeile im Satz (0,00 Sek.)
Kunde B:
Starten Sie die Transaktion und versuchen Sie, ID = 12 zu löschen:
MySQL> Start Transaction; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) MySQL> Aus dem Blog löschen wobei ID = 12;
Der Deletionsoperation erfordert einen Mutex (x), aber das Mutex x und die gemeinsam genutzten Sperre sind inkompatibel. Daher wird die Löschtransaktion in die Warteschlange für die Schleuse eingesetzt und Client B blockiert.
Zu diesem Zeitpunkt möchte der Client A auch 12 löschen:
MySQL> Aus dem Blog löschen wobei ID = 12; Abfrage OK, 1 Zeile betroffen (0,00 Sekunden)
Im Gegensatz zum Referenzartikel war die Löschung erfolgreich, aber Client B hatte einen Fehler:
Fehler 1213 (40001): Deadlock gefunden beim Versuch, Sperre zu bekommen; Versuchen Sie, die Transaktion neu zu starten
Also habe ich versucht, 13 zu löschen, und alles blockiert:
In meinem MyBatis -Testcode, da der vorherige Test kein Verpflichtung hatte, verursachte er Deadlock und es war in Ordnung nach dem Commit. Hier möchte ich sagen, dass die Datenbank an den Lehrer zurückgegeben wurde und die Schlösser und Transaktionen erneut überprüft werden müssen.
2. Anzahl der Datenbankverbindungen zu DataSource in MyBatis
Beim MVN -Test fand ich ein Abfragetest -Druckprotokoll:
2016-07-21 23: 43: 53.356 Debug [org.apache.ibatis.transaction.jdbc.jdbctransaction]-Öffnung der JDBC-Verbindung
2016-07-21 23: 43: 53.356 Debug [org.apache.ibatis.datasource.pooled.pooledDataSource]-Warten bis 20000 Millionen Sekunden auf die Verbindung.
Nachdem er eine Weile gewartet hatte, war die Hinrichtung erfolgreich. Verfolgen Sie den Quellcode und finden Sie dieses Protokoll, um sie zu verstehen. Erstens ist die hier verwendete Datenbankverbindungskonfiguration MyBatis Standard:
<Environment ID = "Development"> <transactionManager type = "jdbc"/> <dataSource type = "Pooled"> <Eigenschaft name = "treiber" value = "$ {jdbc.driver}"/> <Eigenschaft name = "url" value = "$ {jdbc.url}}}/> <username name = "password" value = "$ {jdbc.password}"/> <Eigenschaft name = "password" value = "$ {jdbc.password}"/> <dataSource> </Umgebung> Nach der Anzahl der Verbindungen im Datenbankverbindungspool müssen Sie 2 Sekunden warten, bevor Sie es erhalten. (! state.idleconnections.isempty ()) {// Pool hat connectionConn = state.idleconnections.remove (0); if (log.isdebugenabled ()) {log.debug ("Checked Out Connection" + Conn.GetRealHashCode () + "). (State.ActiveConnections.SIZE () <poolmaximumActiveConnections) {// kann eine neue Verbindung connn = new PooledConnection (DataSource.getConnection () erstellen; ConnectionPooledConnection oldestactiveConnection = STAAT.ActiveConnections.get (0); Long längstcheckouttime = oldestactiveConnection.getCheckouttime (); if (längstcheckouttime> poolmaximumCheckouttime) {// kann überdurchschnittlich ConnectionState beanspruchen. longestCheckouttime; state.activeconnections.remove (oldestactiveConnection); if (! oldestactiveConnection.getrealConnection (). zurück ");}} conn = new PooledConnection (oldestactiveConnection.getRealConnection (), this); oldestactiveConnection.invalidat (); if (log.isdebugenabled ()) {log.debug (" behauptete übergeordnete Überdienung " + conn.GetRealhaStry {idRealhash (). . System.currentTimemillis () - wt;} catch (interruptedException e) {break;}}}}} if (conn! = Null) {if (conn.isvalid ()) {if (! Conn.getrealConnection (). oder Passwort)); Conn.SeTheckoutTimestamp (System.currentTimemillis ()); Conn.SetLastusedTimestamp (System.CurrentTimillis ()); (log.isdebugenabled ()) {log.debug ("Eine schlechte Verbindung ("+conn.getRealhashCode ()+") wurde aus dem Pool zurückgegeben. (log.isdebugenabled ()) {log.debug ("PooledDataSource: konnte keine gute Verbindung zur Datenbank erhalten.");}}}}}}}Wenn die Anzahl der Verbindungen weniger als 10 beträgt, wartet sie auf mehr als 10 Verbindungen, andernfalls wird ein Fehler gemeldet.
Das obige ist der MyBatis Update -Datenbank -Deadlock, um den Warten von Datenbankverbindungspool zu erhalten. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!