Baru -baru ini, saya belajar menguji mybatis, dan tidak ada masalah dengan menambahkan, menghapus, memodifikasi, dan memeriksa sendiri. Akhirnya, saya menemukan beberapa masalah saat menggunakan tes MVN:
1. Pembaruan gagal karena database menemui jalan buntu
2. pilih tunggu, karena kumpulan koneksi koneksi digunakan dan perlu menunggu
mendapatkan:
1. Berani untuk dijelajahi, dan kegigihan adalah kemenangan. Ketika saya pertama kali melihat kesalahan, saya bingung karena saya tidak bisa melihat kesalahan sama sekali. Itu adalah kesalahan yang dilaporkan dalam kerangka kerja. Saya ragu -ragu apakah akan tidur langsung
Lagi pula, saya merasakannya hampir jam 12. Akhirnya, saya menemukan masalah sedikit.
2. Sama seperti di atas, Anda harus berani menggali kode yang tidak Anda pahami dan berani mempelajari kode yang tidak Anda pahami.
3. Menjadi lebih jauh dan lebih jauh dari pembuat kode yang berkualitas, karena semakin banyak Anda belajar, semakin Anda merasakan celah, dan kode Anda penuh dengan jebakan. Jadi, pastikan untuk merekamnya.
Catatan berikut dari dua masalah ini.
1. MySQL Database Deadlock
Di sini, terima kasih kepada http://www.cnblogs.com/lin-xuan/p/5280614.html, saya menemukan jawabannya. Di sini, saya akan membuatnya kembali:
Database Deadlock adalah masalah umum yang dihadapi oleh database transaksional (seperti SQL Server, MySQL, dll.). Kecuali jika masalah deadlock database sering terjadi dan pengguna tidak dapat beroperasi, masalah kebuntuan basis data umumnya tidak serius. Coba cukup tangkapan dalam aplikasi. Jadi bagaimana deadlock data terjadi?
InnoDB mengimplementasikan kunci tingkat baris, yang dibagi menjadi kunci bersama dan kunci mutex (x).
• Kunci bersama digunakan untuk jalur baca transaksi.
• Mutex digunakan untuk pembaruan transaksi atau hapus satu baris.
Ketika klien A memegang kunci bersama dan meminta mutex x; Pada saat yang sama, Klien B memegang mutex X dan meminta kunci bersama S. dalam situasi di atas, kebuntuan basis data akan terjadi. Jika tidak cukup jelas, silakan lihat contoh di bawah ini.
Double membuka dua klien MySQL
Klien A:
Nyalakan transaksi dan kunci kunci bersama saat id = 12:
mysql> Mulai transaksi; kueri ok, 0 baris terpengaruh (0,00 detik) mysql> pilih * dari blog di mana id = 12 terkunci dalam mode berbagi;+----+-------+-----------+| ID | Nama | Author_id |+----+-------+-----------+| 12 | testa | 50 |+----+-------+-----------+1 baris di set (0,00 detik)
Klien B:
Mulai transaksi dan coba hapus ID = 12:
mysql> Mulai transaksi; kueri ok, 0 baris terpengaruh (0,00 detik) mysql> hapus dari blog di mana id = 12;
Operasi penghapusan membutuhkan mutex (x), tetapi mutex x dan kunci bersama tidak kompatibel. Oleh karena itu, transaksi hapus ditempatkan dalam antrian permintaan kunci, dan klien B diblokir.
Saat ini, klien A juga ingin menghapus 12:
mysql> hapus dari blog di mana id = 12; kueri ok, 1 baris terpengaruh (0,00 detik)
Berbeda dengan artikel referensi, penghapusan berhasil, tetapi klien B memiliki kesalahan:
Kesalahan 1213 (40001): Deadlock ditemukan ketika mencoba mendapatkan kunci; Cobalah memulai kembali transaksi
Jadi, saya mencoba menghapus 13, dan semuanya diblokir:
Dalam kode uji MyBatis saya, karena tes sebelumnya tidak memiliki komit, itu menyebabkan kebuntuan, dan itu baik -baik saja setelah komit. Di sini, saya ingin mengatakan bahwa database telah dikembalikan ke guru, dan kunci dan transaksi perlu ditinjau lagi.
2. Jumlah koneksi basis data ke data data di mybatis
Ketika saya MVN Test, saya menemukan log uji kueri Log:
2016-07-21 23: 43: 53.356 DEBUG [org.apache.ibatis.transaction.jdbc.jdbctransaction]-Membuka koneksi JDBC
2016-07-21 23: 43: 53.356 DEBUG [org.apache.ibatis.datasource.pooled.pooledDataSource]-Menunggu selama 20000 juta detik untuk koneksi.
Jadi, setelah menunggu beberapa saat, eksekusi berhasil. Lacak kode sumber dan temukan log ini untuk dipahami. Pertama -tama, konfigurasi koneksi database yang saya gunakan di sini adalah mybatis default:
<Lingkungan id = "pengembangan"> <transactionManager type = "jdbc"/> <datasource type = "pooled"> <properti name = "driver" value = "$ {jdbc.driver}"/> <name properti = "name" nalue = "$ {jdbc.url}"//<name properta = "uSern" nalue = "$" $ JDBC name = "password" value = "$ {jdbc.password}"/> <name properti = "kata sandi" value = "$ {jdbc.password}"/> <DataSource> </vencher> Setelah jumlah koneksi dalam kumpulan koneksi database, Anda harus menunggu 2 detik sebelum mendapatkannya: while (conn == NULK) {Anda harus menunggu 2 detik sebelum mendapatkannya: while (conn == NULL) {Anda harus menunggu 2 detik sebelum mendapatkannya: whene (conn == null) {Anda harus menunggu 2 detik sebelum mendapatkannya: while (conn == null. (!!! (state.activeConnections.size () <poolmaximumactiveConnections) {// dapat membuat koneksi baru = pooledConnection baru (dataSource.getConnection (), this); if (log.isdebugeNabled ()) {log.debug ("ciptaan koneksi" + conn.getrealhashc ()) {). ConnectionPooledConnection OLDESTICTIVECONNECTION = state.activeConnections.get (0); LongestCheckoutTime = ODDESTACTIVECONNECTION.GetCheckoutTime (); if (longestCheckoutTime> poolmaMimumCheckoutTime) {// dapat mengklaim connectionState overdue.ClaimedOverDueconnectionCount ++; state.accumulatedCheckoutTimeOnduConnection += longestCheckoutTime. state. state.accumulatedCheckOutTimeOnduEnconection += longestCheckOutTime. State. State. State. State. State. State. State. State; state. LongestCheckoutTime; state.activeConnections.remove (OLDESTACTIVECONNECTION); if (! ODDESTACTIVECONNECTION.getRealConnection (). GetAutocommit ()) {coba {tidak dapat kembali. } conn = PooledConnection baru (ODDEtActiveConnection.getRealConnection (), this); OddestActiveConnection.Invalidate (); if (log.isdebugeNabled ()) {log.debug ("Koneksi overdue" + conn.getRealHashCode () () "." {state.hadtowaitcount ++; countedwait = true;} if (log.isdebugeNabled ()) {log.debug ("menunggu selama" +pooltimetowait +"miliarseconds untuk koneksi.");} long wt = System.currentTimemillis (); state. System.currentTimeMillis () - wt;} catch (InterruptedException e) {break;}}}}} if (conn! = Null) {if (conn.isvalid ()) {if (! Conn.getRealconnection (). GetAutOcmit ()) {conn.getRealConnection (). rollback ();} conn.setConnectionTypeCode (AssembleconnectionTypeCode (DataSource.getUrl (), nama pengguna, kata sandi)); conn.setcheckoutTimestamp (System.currentTimeMillis ()); conn.setLastusedTimestamp (System.currentTimeMillis ()); state.activeConnections.Add (conn); state.requestcount ++; state.accumulatedtime waktu+= System.current. (log.isdebugeNabled ()) {log.debug ("Koneksi buruk ("+conn.getrealhashCode ()+") dikembalikan dari kumpulan, mendapatkan koneksi lain.");} state.badconnectionCount ++; poolycount> poolycount ++; conn = null; if localbadconx> poolycoxcount> poolycount ++; conn = null; if localbadconx> poolingcount> poolycount ++; conn = null; if localbadconx> {localbadconpox> localbadcount / conncount; (log.isdebugeNabled ()) {log.debug ("pooledDataSource: tidak bisa mendapatkan koneksi yang baik ke database.");}}}}}}Ketika jumlah koneksi kurang dari 10, ia akan menunggu lebih dari 10 koneksi, jika tidak kesalahan akan dilaporkan.
Di atas adalah deadlock database pembaruan mybatis untuk mendapatkan kumpulan koneksi basis data menunggu. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!