Recentemente, aprendi a testar Mybatis e não havia nenhum problema em adicionar, excluir, modificar e verificar sozinho. Finalmente, encontrei vários problemas ao usar o teste da MVN:
1. Atualização falhou porque o banco de dados está em impasse
2. Selecione Espera, porque o pool de conexão é usado e precisa esperar
pegar:
1. Seja corajoso para explorar, e a persistência é a vitória. Quando vi o erro pela primeira vez, fiquei confuso porque não conseguia ver o erro. Foi um erro relatado dentro da estrutura. Eu estava hesitando se deveria dormir diretamente
Afinal, eu sinto que são quase 12 horas. Finalmente, achei o problema um pouco.
2. O mesmo que acima, você deve ousar cavar em códigos que não entende e ousa estudar códigos que não entende.
3. Tornando -se cada vez mais distante de um codificador qualificado, porque quanto mais você aprende, mais você sente as brechas e seu código está cheio de armadilhas. Então, não deixe de gravar.
Os seguintes registros dessas duas questões.
1. MySQL Database Deadlock
Aqui, graças a http://www.cnblogs.com/lin-xuan/p/5280614.html, encontrei a resposta. Aqui, vou recriá -lo:
O Deadlock do banco de dados é um problema comum encontrado por bancos de dados transacionais (como SQL Server, MySQL etc.). A menos que o problema de impulso do banco de dados ocorra com frequência e o usuário não possa operar, o problema do deadlock do banco de dados geralmente não é grave. Apenas tente-Catch no aplicativo. Então, como ocorre o impasse de dados?
O Innodb implementa bloqueios de nível de linha, divididos em bloqueios compartilhados e bloqueios mutex (x).
• O bloqueio compartilhado é usado para a linha de leitura da transação.
• Mutex é usado para atualização da transação ou excluir uma linha.
Quando o cliente A segura o bloqueio compartilhado e solicita o mutex x; Ao mesmo tempo, o cliente B mantém o mutex X e solicita o bloqueio compartilhado S. Na situação acima, ocorrerá um impasse de banco de dados. Se não estiver claro o suficiente, veja o exemplo abaixo.
Double abrindo dois clientes MySQL
Cliente A:
Ligue a transação e bloqueie o bloqueio compartilhado quando o ID = 12:
MySQL> Start Transaction; Query OK, 0 linhas afetadas (0,00 s) mysql> selecione * no blog onde id = 12 bloquear o modo de compartilhar;+----+-------+-----------+| id | nome | autor_id |+----+-------+-----------+| 12 | testa | 50 |+----+-------+-----------+1 linha no conjunto (0,00 s)
Cliente B:
Inicie a transação e tente excluir ID = 12:
MySQL> Start Transaction; Query OK, 0 linhas afetadas (0,00 s) mysql> excluir do blog onde id = 12;
A operação de exclusão requer um mutex (x), mas o mutex x e o bloqueio compartilhado s são incompatíveis. Portanto, a transação de exclusão é colocada na fila de solicitação de bloqueio e o cliente B é bloqueado.
Neste momento, o cliente A também deseja excluir 12:
mysql> exclua do blog onde id = 12; consulta ok, 1 linha afetada (0,00 s)
Ao contrário do artigo de referência, a exclusão foi bem -sucedida, mas o cliente B teve um erro:
Erro 1213 (40001): Deadlock encontrado ao tentar ser bloqueado; Tente reiniciar a transação
Então, eu tentei excluir 13, e tudo bloqueou:
No meu código de teste Mybatis, porque o teste anterior não teve comprometimento, causou um impasse e tudo bem após o comprometimento. Aqui, quero dizer que o banco de dados foi devolvido ao professor e as fechaduras e transações precisam ser revisadas novamente.
2. Número de conexões de banco de dados para o DataSource em Mybatis
Quando o teste MVN, encontrei um log de impressão de teste de consulta:
2016-07-21 23: 43: 53.356 Debug [org.apache.ibatis.transaction.jdbc.jdbctransaction]-Conexão JDBC de abertura
2016-07-21 23: 43: 53.356 Debug [org.apache.ibatis.datasource.pooled.pooledDataSource]-Esperando até 20000 milhões de segundos para conexão.
Então, depois de esperar um pouco, a execução foi bem -sucedida. Rastreie o código -fonte e encontre este log para entender. Primeiro de tudo, a configuração de conexão do banco de dados que eu uso aqui é o padrão do mybatis:
<Environment Id = "Development"> <transactionManager tipo = "JDBC"/> <DataSource type = "pooled"> <propriedade name = "driver" value = "$ {jdbc.driver}"/> <propriedades = "url" value = "$ {jdbc.url}"/> <nome = "usernam name = "senha" value = "$ {jdbc.password}"/> <propriedade name = "senha" value = "$ {jdbc.password}"/> <DataSource> </ambiental> Após o número de conexões no pool de conexão do banco de dados, você deve esperar 2 segundos antes de obtê -lo: (== Null) {sinl) {sinl) {sinl) {sinl). (! state.idleConnections.isempty ()) {// pool possui conexão de conexão disponível = state.idleConnections.remove (0); if (log.isdebugenabled ()) {log.debug ("verifiquei a conexão". (State.ActiveConnectionS.Size () <PoolMaximumActiveConnections) {// pode criar new ConnectionConn = new PoolEdConnection (DataSource.getConnection (), this); if (Log.isDebugenabled ()) {Log.Debug ("Criado" + ConnecticpReLhashhhashhhashhhhash () {Log.Debug ("Criado" + ConnecnetReLhashhhashhhashhhhhash ()) {Log.Debug ("Criado" + ConnecnetReLhashhHash ConnectionPooledConnection OldestActiveConnection = state.activeConnections.get (0); longestCheckoutTime = OldestActiveConnection.getCheckoutTime (); if (LongestCheckoutTime> PoolMaximumCheckoutTime) {// pode reivindicar Overdue ConnectionState.ClaimEDOVERDUECONNECTIONCOUNT ++; State.AccumuledCheckOtTimeOfCoverDuEnConnections += longestCheckoutTime; LongestCheckoutTime; State.ActiveConnectionS.Remove (OldestActiveConnection); if (! OldestActiveConnection.GetRealConnection (). getAutocommit ()) {try {antigo. } Conn = new PoolEdConnection (OldestActiveConnection.getRealConnection (), this); OldestActiveConnection.Invalidate (); if (log.isdebugenabled ()) {Log.debug ("Conexão em atraso reivindicada" + Conn.GeReRealhCode () + ""; {state.hadtowaitcount ++; countEdwait = true;} if (log.isdebugenabled ()) {log.debug ("Esperando enquanto" +pooltimetowait +"milhões de segundos para a conexão");} wt = System.CurrentTimillis (); estate.wait (piscina (piscina "; System.currenttimemillis () - wt;} catch (interruptEdException e) {break;}}}}} if (conn! = Null) {if (Conn.isValid ()) {if (! ConnectRealConnection (). GetAutocommit ()) {Conn.GetRealConnection (). Rollback ();} Conn.SetConnectionTyPecode (AssembleConnectionTyPecode (DataSource.geturl (), nome de usuário, senha)); Conn.SetcheckOutTimestamp (System.CurrentTimEmillis ()); Conn.SetLastusedTimestamp (System.CurrentTimEmillis ()); State.ActiveConnectionS.add (Conn); State.ReQuestCount ++; {log.debug ("Uma conexão ruim ("+Conn.GetRealHashCode ()+") foi devolvida da piscina, obtendo outra conexão.");} state.badConnectionCount ++; localbadConnectionCount ++; Conn = null; if (localBadConCOUND> (PoolMaximumCount ++; {log.debug ("pooledDataSource: não conseguiu uma boa conexão com o banco de dados.");}}}}}}Quando o número de conexões for menor que 10, ele aguardará mais de 10 conexões, caso contrário, um erro será relatado.
O exposto acima está o impasse Mybatis Update Database Deadlock para obter o pool de conexão do banco de dados em espera. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!