Недавно я научился тестировать Mybatis, и не было никаких проблем с добавлением, удалением, изменением и проверкой в одиночку. Наконец, я нашел несколько проблем при использовании теста MVN:
1. Обновление не удалось, потому что база данных зайчено в тупик
2. Выберите подождите, потому что пул соединений составлен и должен ждать
получать:
1. Будь смелым, чтобы исследовать, а настойчивость - это победа. Когда я впервые увидел ошибку, я был в замешательстве, потому что я вообще не видел ошибки. Это была ошибка, зарегистрированная в рамках. Я колебался, спать напрямую
Я чувствую это, в конце концов, это почти 12 часов. Наконец, я нашел проблему немного.
2. То же, что и выше, вы должны осмелиться взорвать коды, которые вы не понимаете, и осмеливаться изучать коды, которые вы не понимаете.
3. Стать дальше и дальше от квалифицированного кодера, потому что чем больше вы учитесь, тем больше вы чувствуете лазейки, а ваш код полон ловушек. Итак, обязательно запишите это.
Следующие записи этих двух выпусков.
1. Mysql Database Deadlock
Здесь, спасибо http://www.cnblogs.com/lin-xuan/p/5280614.html, я нашел ответ. Здесь я воссоздаю это:
Законный тупик базы данных является распространенной проблемой, с которой сталкиваются транзакционные базы данных (например, SQL Server, MySQL и т. Д.). Если проблема с тупиком базы данных часто не возникает, и пользователь не может работать, проблема тупика базы данных, как правило, не является серьезной. Просто попробуйте приложить в приложение. Итак, как происходит тупик данных?
InnoDB реализует блокировки уровня строк, которые разделены на общие замки (ы) и замки Mutex (x).
• Общая блокировка используется для линии чтения транзакций.
• Mutex используется для обновления транзакции или удаления одной строки.
Когда клиент A держит общий блокировку S и запрашивает Mutex X; В то же время, клиент B удерживает Mutex X и запрашивает общую блокировку S. В вышеупомянутой ситуации произойдет тупик базы данных. Если это недостаточно, пожалуйста, смотрите пример ниже.
Двойное открытие двух клиентов MySQL
Клиент А:
Включите транзакцию и заблокируйте общую блокировку, когда id = 12:
MySQL> Start Transaction; запрос OK, 0 строк затронуты (0,00 с) MySQL> SELECT * из блога, где id = 12 Lock в режиме общего;+----+-------+-----------+| id | имя | Author_id |+----+-------+-----------+| 12 | testa | 50 |+----+-------+-----------+1 строка в наборе (0,00 с)
Клиент B:
Начните транзакцию и попробуйте удалить ID = 12:
MySQL> Start Transaction; запрос OK, 0 рядов затронуты (0,00 с) MySQL> Удалить из блога, где id = 12;
Операция удаления требует Mutex (x), но Mutex x и общие блокировки S несовместимы. Следовательно, транзакция удаления помещается в очередь запроса блокировки, а клиент B заблокирован.
В настоящее время клиент также хочет удалить 12:
MySQL> Удалить из блога, где ID = 12; запрос OK, 1 строка затронута (0,00 с)
В отличие от справочной статьи, удаление было успешным, но у клиента B была ошибка:
Ошибка 1213 (40001): тупик найден при попытке получить блокировку; Попробуйте перезапустить транзакцию
Итак, я попытался удалить 13, и все это заблокировано:
В моем коде теста Mybatis, поскольку предыдущий тест не имел совершения, это вызвало тупик, и это было нормально после совершения. Здесь я хочу сказать, что база данных была возвращена учителю, и замки и транзакции должны быть снова рассмотрены.
2. Количество подключений к базе данных с данным данных в Mybatis
Когда я тест MVN, я нашел журнал печати теста на запрос:
2016-07-21 23: 43: 53,356 Debug [org.apache.ibatis.transaction.jdbc.jdbctransaction]-Открытие соединения JDBC
2016-07-21 23: 43: 53 356 отладка [org.apache.ibatis.datasource.pooled.pooleddatasource]-ожидание до 20000 миллионов секунд для подключения.
Итак, после ожидания казнь была успешной. Отслеживайте исходный код и найдите этот журнал, чтобы понять. Прежде всего, конфигурация подключения к базе данных, которую я использую здесь, по умолчанию Mybatis:
<среда идентификатора = "разработка"> <transactionManager type = "jdbc"/> <dataSource type = "Booled"> <name = "Driver" value = "$ {jdbc.driver}"/> <name = "url" value = "$ {jdbc.Url}"/> name = "usErname" value = "$ {jdbc.Url}"/> <property = "usErname" = "$ {jdbc.Url}"/> "/"/""/"/" "/>"/> ") value = "$ {jdbc.password}"/> <name = "password" value = "$ {jdbc.password}"/> <dataSource> </envenerition> После количества соединений в пуле подключений базы данных используется, вам нужно ждать 2 секунды, прежде чем получить его: while (conn = nully) {synchronized (состояние) {if (! Ideconse.ис. {// Pool имеет доступное ConnectionConn = state.idleconnections.remove (0); if (log.isdebugenabled ()) {log.debug ("Проверено соединение" + conn.getRealhashcode () + "из пула.");}} Else {// pool не имеет доступного connectionif (state.Activecnections.sizes.sizes.sizes.sizes.size () <poolcommec. {// может создать New ConnectionConn = new PooledConnection (dataSource.getConnection (), this); if (log.isdebugenabled ()) {log.debug ("Создано соединение" + conn.getRealHashcode () + ".");}} Else {// не может создать новое соединение. long longestcheckouttime = storgeStActiveConnection.getCheckouttime (); if (longestCheckouttime> poolmaximumCeckouttime) {// может претендовать на просроченное соединение. LongestCheckouttime; state.ActiveConnections.remove (ensteStActiveConnection); if (! estearEStActiveConnection.getRealConnection (). getautocommit ()) {try {storstaCtActiveConnection.getRealConnection (). rowlback ();} Catch e Catchception e) {log.De (). } conn = new PoolEdConnection (orsteStActiveConnection.getRealConnection (), this); storgeStActiveConnection.invalidate (); if (log.isdebugenabled ()) {log.debug («Запрещенное подключение к Overdue» + conn.getRealhashde () + ». {state.hadtowaitCount ++; counttedwait = true;} if (log.isdebugenabled ()) {log.debug («ожидание до долгого времени, как« +pooltimetowait +»миллионы секунд для соединения.»);} wt = system.currenttimelis (); System.currentTimeMillis () - wt;} catch (прерывание Exception e) {break;}}}}} if (conn! = Null) {if (conn.isvalid ()) {if (! Conn.getRealConnection (). GetAutocommit ()) {if (! Conn.getRealConcection ().. {conn.getRealConnection (). rolback ();} conn.setConnectionTypecode (AssembleConnectionTyPecode (dataSource.getUrl (), имя пользователя, пароль)); conn.setcheckouttimestamp (system.currenttimemillis ()); conn.setlastusedtimestamp (system.currenttimemillis ()); state.activeconnections.add (conn); state.requestcount ++; state.accumulateRequesttime+= System.CurrentIsilis () - t; (log.isdebugenabled ()) {log.debug («Плохое соединение ("+conn.getRealHashCode ()+") было возвращено из пула, получение другого соединения.");} state.badconnectionCount ++; localbadconnectionCount ++; conn = null; if (localbadconcountcountcountcountcountcountcountcountectionsenectionsenectionsenectioncontecumnection+3; (log.isdebugenabled ()) {log.debug ("booleddatasource: не удалось получить хорошее соединение с базой данных.");}}}}}}Когда количество подключений составляет менее 10, оно будет ждать более 10 соединений, в противном случае будет сообщена ошибка.
Выше приведено тупик базы данных Mybatis Update для получения пула подключений к базе данных. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!