Recientemente, aprendí a probar mybatis, y no hubo ningún problema para agregar, eliminar, modificar y verificar solo. Finalmente, encontré varios problemas al usar la prueba MVN:
1. Actualizar fallado porque la base de datos está bloqueada
2. Seleccione la espera, porque el grupo de conexión de conexión se usa y necesita esperar
conseguir:
1. Sea valiente para explorar, y la persistencia es la victoria. Cuando vi por primera vez el error, estaba confundido porque no podía ver el error en absoluto. Fue un error reportado dentro del marco. Estaba dudando si dormir directamente
Lo siento, después de todo, son casi las 12 en punto. Finalmente, encontré el problema un poco.
2. Igual que el anterior, debe atreverse a cavar en códigos que no comprende y se atreve a estudiar códigos que no comprenda.
3. Estar cada vez más lejos de un codificador calificado, porque cuanto más aprende, más sientes las lagunas y tu código está lleno de dificultades. Entonces, asegúrese de grabarlo.
Los siguientes registros de estos dos problemas.
1. Mysql Database Deadlock
Aquí, gracias a http://www.cnblogs.com/lin-xuan/p/5280614.html, encontré la respuesta. Aquí lo recrearé:
El punto muerto de la base de datos es un problema común encontrado por bases de datos transaccionales (como SQL Server, MySQL, etc.). A menos que el problema de punto muerto de la base de datos ocurra con frecuencia y el usuario no puede operar, el problema de punto muerto de la base de datos generalmente no es grave. Simplemente pruebe la captura en la aplicación. Entonces, ¿cómo ocurre el punto muerto de datos?
InnoDB implementa bloqueos de nivel de fila, que se dividen en cerraduras compartidas y bloqueos mutex (x).
• El bloqueo compartido se usa para la línea de lectura de transacciones.
• Mutex se usa para la actualización de la transacción o eliminar una línea.
Cuando el cliente A contiene los bloqueos compartidos y solicita el mutex x; Al mismo tiempo, el cliente B contiene el mutex x y solicita el bloqueo compartido S. En la situación anterior, se producirá un punto muerto de la base de datos. Si no está lo suficientemente claro, consulte el ejemplo a continuación.
Abra de dos clientes MySQL
Cliente A:
Encienda la transacción y bloquee el bloqueo compartido cuando ID = 12:
mysql> inicio de transacción; consulta OK, 0 filas afectadas (0.00 segundos) mysql> select * del blog donde id = 12 bloqueo en modo compartido;+----+-------+-----------+| ID | nombre | autor_id |+----+-------+-----------+| 12 | Testa | 50 |+----+-------+-----------+1 fila en el set (0.00 segundos)
Cliente B:
Inicie la transacción e intente eliminar ID = 12:
mysql> inicio de transacción; consulta OK, 0 filas afectadas (0.00 segundos) mysql> eliminar del blog donde id = 12;
La operación de eliminación requiere un mutex (x), pero el mutex x y los bloqueos compartidos son incompatibles. Por lo tanto, la transacción de eliminación se coloca en la cola de solicitud de bloqueo y el cliente B está bloqueado.
En este momento, el cliente A también quiere eliminar 12:
MySQL> Eliminar del blog donde id = 12; consulta bien, 1 fila afectada (0.00 segundos)
A diferencia del artículo de referencia, la eliminación fue exitosa, pero el Cliente B tuvo un error:
Error 1213 (40001): punto muerto encontrado cuando se intenta bloquear; Intente reiniciar la transacción
Entonces, intenté eliminar 13, y todo bloqueó:
En mi código de prueba MyBatis, porque la prueba anterior no tenía compromiso, causó un punto muerto, y estaba bien después de cometer. Aquí, quiero decir que la base de datos ha sido devuelta al maestro, y las cerraduras y las transacciones deben revisarse nuevamente.
2. Número de conexiones de bases de datos a DataSource en MyBatis
Cuando prueba MVN, encontré un registro de impresión de prueba de consulta:
2016-07-21 23: 43: 53,356 DEBUG [org.apache.ibatis.transaction.jdbc.jdbctransaction]-abriendo la conexión JDBC
2016-07-21 23: 43: 53,356 Debug [org.apache.ibatis.datasource.pooled.pooleddatasource]-esperando hasta 20000 millones de segundos para la conexión.
Entonces, después de esperar un tiempo, la ejecución fue exitosa. Rastree el código fuente y busque este registro para comprender. En primer lugar, la configuración de conexión de la base de datos que uso aquí es MyBatis predeterminada:
<Environment id = "desarrollo"> <transaccionManager type = "jdbc"/> <dataSource type = "agrupado"> <propiedad name = "controlador" valor = "$ {jdbc.driver}"/> <propiedad name = "url" valor = "$ {jdbc.url}"/> <name de propiedad = "usue" usue = "$ {jdbc.useName}/name} value = "$ {jdbc.password}"/> <propiedad name = "contraseña" value = "$ {jdbc.password}"/> <shaceSource> </balentle> Después de que el número de conexiones en el grupo de conexión de la base de datos se usa, debe esperar 2 segundos antes de obtenerlo: while (conn == null) {sincronizado (sincronizado) {if (! {// Pool tiene un grupo disponible connconn = state.idleconnections.remove (0); if (log.isdeBugeNabled ()) {log.debug ("verificar la conexión" + conn.getRealHashCode () + "de la piscina");}} else {// Pool no tiene la conexión de conexión (state.activeNnections.size () <). PoolMaxImumActiveConnections) {// puede crear una nueva conexión connconn = new PooledConnection (dataSource.getConnection (), this); if (log.isdeBugenabled ()) {log.Debug ("creó la conexión" + conn.getRealHashCode () + ".");}} más {// no puede crear una nueva conexión. state.activeconnections.get (0); Long LongestCheckoutTime = OldestActivEConnection.getCheckoutTime (); if (LongestCheckoutTime> PoolMaxiMumCheckoutTime) {// puede reclamar conexión Overdue LongestCheckouttime; state.activeconnections.remove (OldestActiveConnection); if (! OldestActiveConnection.getRealConnection (). back ");}} Conn = new PooledConnection (OldestActivEConnection.getRealConnection (), this); OldestActiveConnection.Invalidate (); if (log.isDeBugEnabled ()) {log.deBug (" Conexión exagerada reclamada " + conn.getReLhashcode () +");}} la otra. (! CountedWait) {state.hadTowaitCount ++; CountedWait = true;} if (log.isdeBugeNabled ()) {log.debug ("Esperando tanto como" + PooltimeTowait + "Millionseconds para la conexión.");} long = System.CurrentTimemEmemis (); state.wait (grupo de piscina += System.CurrentTimEmillis () - Wt;} Catch (InterruptedException e) {break;}}}}} if (conn! = Null) {if (conn.isvalid ()) {if (! Conn.getrealconnection (). GetAutocommit ()) {Conn.getRealConnection (). Rollback ();} Conn.SetConnectionTyPeCode (ensambleconnectionTypeCode (dataSource.getUrl (), nombre de usuario, nombre de usuario, contraseña)); conn.setcheckouttimeStamp (System.CurrentTimEmillis ()); conn.setLastusSeSeStamp (System.CurrentTimEmillis ()); state.activeconnections.add (conn); state.requestCount ++; state.accumulatedRequesttime+= system.CurrentTimemillis () - T;} else {{ME (log.isdeBugeNabled ()) {log.deBug ("una conexión mala ("+conn.getRealHashCode ()+") se devolvió desde el grupo, obteniendo otra conexión.");} state.badconnectionCount ++; localbadconnectionCount ++; conn = null; if (localbadconnectionCount> (piscolmaxidlEdlEdLEdlEdLEdlectionsEntEdLEntions) (log.isDebugeNabled ()) {log.debug ("PooledDataSource: no pudo obtener una buena conexión a la base de datos");}}}}}Cuando el número de conexiones es inferior a 10, esperará más de 10 conexiones, de lo contrario se informará un error.
Lo anterior es el punto muerto de la base de datos de actualizaciones de MyBatis para obtener la espera del grupo de conexión de la base de datos. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!