Récemment, j'ai appris à tester Mybatis, et il n'y avait aucun problème à ajouter, supprimer, modifier et vérifier seul. Enfin, j'ai trouvé plusieurs problèmes lors de l'utilisation du test MVN:
1. La mise à jour a échoué parce que la base de données est bloquée
2.Sélectionnez attendre, car le pool de connexion de connexion est utilisé et doit attendre
obtenir:
1. Soyez courageux à explorer, et la persistance est la victoire. Quand j'ai vu l'erreur pour la première fois, j'étais confus parce que je ne pouvais pas voir l'erreur du tout. C'était une erreur rapportée dans le cadre. J'hésitais à dormir directement
Je le sens, après tout, il est presque 12 heures. Enfin, j'ai trouvé un peu le problème.
2. Comme ci-dessus, vous devez oser creuser dans les codes que vous ne comprenez pas et osez étudier les codes que vous ne comprenez pas.
3. Devenir de plus en plus loin d'un codeur qualifié, car plus vous en apprenez, plus vous ressentez les lacunes et votre code est plein de pièges. Alors, assurez-vous de l'enregistrer.
Les enregistrements suivants de ces deux numéros.
1. MySQL Database Base de blocage
Ici, grâce à http://www.cnblogs.com/lin-xuan/p/5280614.html, j'ai trouvé la réponse. Ici, je vais le recréer:
L'impasse de la base de données est un problème courant rencontré par les bases de données transactionnelles (telles que SQL Server, MySQL, etc.). À moins que le problème de l'impasse de la base de données ne se produise fréquemment et que l'utilisateur ne peut pas fonctionner, le problème de l'impasse de la base de données n'est généralement pas grave. Essayez simplement le coup dans l'application. Alors, comment se produit l'impasse des données?
INNODB implémente les verrous au niveau des lignes, qui sont divisés en verrous (s) partagés et serrures mutex (x).
• Le verrouillage partagé est utilisé pour la ligne de lecture des transactions.
• Mutex est utilisé pour la mise à jour des transactions ou supprimer une ligne.
Lorsque le client A détient le verrouillage partagé et demande le mutex x; Dans le même temps, le client B détient le mutex x et demande le verrouillage partagé S. Dans la situation ci-dessus, une impasse de la base de données se produira. S'il n'est pas assez clair, veuillez consulter l'exemple ci-dessous.
Ouverture de deux clients MySQL
Client A:
Allumez la transaction et verrouillez le verrouillage partagé lorsque id = 12:
MySQL> Start Transaction; Requête OK, 0 lignes affectées (0,00 sec) MySQL> Sélectionner * dans le blog où ID = 12 verrouillage en mode partage; + ---- + ------- + ----------- + | ID | Nom | Author_id | + ---- + ------- + ----------- + | 12 | testa | 50 | + ---- + ------- + ----------- + 1 Row in Set (0,00 sec)
Client B:
Démarrez la transaction et essayez de supprimer ID = 12:
MySQL> Start Transaction; requête OK, 0 lignes affectées (0,00 sec) MySQL> Supprimer du blog où id = 12;
L'opération de suppression nécessite un mutex (x), mais le mutex x et les verrous partagés sont incompatibles. Par conséquent, la transaction de suppression est placée dans la file d'attente de demande de verrouillage et le client B est bloqué.
Pour le moment, le client A veut également supprimer 12:
mysql> supprimer du blog où id = 12; requête ok, 1 ligne affectée (0,00 sec)
Contrairement à l'article de référence, la suppression a réussi, mais le client B a eu une erreur:
Erreur 1213 (40001): Implicité trouvée lorsque vous essayez de se verrouiller; Essayez de redémarrer la transaction
J'ai donc essayé de supprimer 13, et tout a bloqué:
Dans mon code de test MyBatis, parce que le test précédent n'avait pas de validation, il a provoqué une impasse, et c'était OK après avoir commis. Ici, je tiens à dire que la base de données a été retournée à l'enseignant et que les serrures et les transactions doivent être examinées à nouveau.
2. Nombre de connexions de base de données à la source de données dans Mybatis
Lorsque je testais MVN, j'ai trouvé un journal d'impression de test de requête:
2016-07-21 23: 43: 53,356 Debug [org.apache.ibatis.transaction.jdbc.jdbctransaction] - Ouverture de la connexion JDBC
2016-07-21 23: 43: 53 356 DEBUG [org.apache.ibatis.datasource.pooled.pooleddatasource] - en attendant jusqu'à 20000 millions de secondes pour la connexion.
Donc, après avoir attendu un certain temps, l'exécution a réussi. Suivez le code source et trouvez ce journal à comprendre. Tout d'abord, la configuration de la connexion de la base de données que j'utilise ici est MyBatis par défaut:
<environnement id = "Development"> <transactionManager type = "jdbc" /> <dataSource type = "poolled"> <propriété name = "driver" value = "$ {jdbc.driver}" /> <propriété name = "url" value = "$ {jdbc.url}" /> <propriété name = "username" value = "$ {jdbc.usame} name = "mot de passe" value = "$ {jdbc.password}" /> <propriété name = "mot de passe" value = "$ {jdbc.password}" /> <dataSource> </ Environment> Une fois le nombre de connexions dans le pool de connexions de la base de données, vous devez attendre 2 secondes avant l'obtenir: while (CONN == Null) {Synchronized (State) {si (! state.idleconnections.isempty ()) {// pool a disponible ConnectionConn = state.idleconnections.remove (0); if (log.isdebugeabled ()) {log.debug ("vérifié" + Conn.getRealHashCode () + "From Pool. (State.ActiveConnections.size () <PoolMaxImUmActiveConnections) {// peut créer une nouvelle connexionConn = new poolEdConnection (dataSource.getConnection (), this); if (log.isdebugeNable ()) {log.debug ("Created Connection" + Conn.getRealHashcode () + ".");}} ConnectionPoolEdConnection OldestActiveConnection = state.activeConnection.get (0); LONGELLESTCHECKOUNTTIME = OLDESTACTIVECONNECTION.GETCHECKOUTTHILE (); if (LongstCheckoutTime> PoolMaxImCHECKOutTime) {// peut prétendre en attente ConnectionState.ClaimeMoverDueConnectionCount ++; State.AccumuledCheckoutTimeOfoverDueConnection + = LongestCheckoutTime; State.AccumuledChetCheckout + = LongestCheckoutTime; state.activeConnection.Remove (oldestActiveConnection); if (! oldestActiveConnection.getRealConnection (). getAutoCommit ()) {try {oldestActiveConnection.getRealConnection (). Rollback ();} ne pas roll } conn = new poledConnection (anciennestActiveConnection.getRealConnection (), this); oldestActiveConnection.Invalidate (); if (log.isdebugeNabled ()) {log.debug ("Connexion de surexécrète" + Conn.getRealHashCode () + ");}} else {// DOST WATTERNY {if (!");}} {state.hadtowaitcount ++; comptedWait = true;} if (log.isdebugeNabled ()) {log.debug ("en attente aussi longtemps que" + poolmetowait + "millionsecds for Connection.");} long wt = system.currenttimeMeLis (); state.wait (poolimeTowAt); state.accuculate System.CurrentTimemillis () - WT;} Catch (InterruptedException e) {Break;}}}}} if (Conn! = Null) {if (conn.isvalid ()) {if (! Conn.getRealConnection (). GetAutOcommit ()) ot Mot de passe)); conn.SetcheckouttimeStamp (System.Currenttimemillis ()); conn.SetLastUseTtimestamp (System.Currenttimemillis ()); State.AccuVeConnection.Add (Conn); State.requestCount ++; {log.debug ("Une mauvaise connexion (" + conn.getRealHashCode () + ") a été renvoyée de la piscine, obtenant une autre connexion.");} state.badconnectionCount ++; localBadConnectionCount ++; Conne = Null; if (localBadconnectionCount> (poolMaxiMumidleConnection + 3)) {if (Log.IsDebugedLeconnections) {Log.Debug ("pooledDataSource: n'a pas pu obtenir une bonne connexion à la base de données.");}}}}}}Lorsque le nombre de connexions est inférieur à 10, il attendra plus de 10 connexions, sinon une erreur sera signalée.
Ce qui précède est la présentation de la base de données MyBatis Update pour obtenir l'attente du pool de connexions de la base de données. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!