Saat menggunakan JDBC untuk terhubung ke database MySQL untuk penyisipan data, terutama batch data yang besar dimasukkan secara terus menerus (100.000). Bagaimana cara meningkatkan efisiensi?
Ada dua metode pernyataan dalam antarmuka pemrograman JDBC yang sangat penting:
Pemrosesan data batch dapat dicapai dengan menggunakan addBatch() dan executeBatch() .
Namun, perlu dicatat bahwa pertama -tama Anda perlu mengatur komit manual di tautan database, connection.setAutoCommit(false) , dan kemudian menjalankan connection.commit() setelah pernyataan dieksekusi.
Impor java.io.bufferedReader; import java.io.ioexception; impor java.sql.driverManager; impor java.sql.preparedstatement; import java.sql.sqlexception; import java.util.date; impor com.mysql.jdbc.uncyclats; sql = "masukkan ke dalam nilai db_test (param1, param2, param3, param4, param5) (?,?,?,?,?)"; Private String charset = "UTF-8"; Private String ConnectStr = "JDBC: MySQL: // LocalHost: 3306/test"; private string username = "root"; Private String Password = "123456"; private void dostore () melempar ClassNotFoundException, SQlexception, IoException {class.forname ("com.mysql.jdbc.driver"); connectStr += "? menggunakanPerRprepStMts = false & recriteBatchedStatements = true"; // Berikut adalah tes untuk penyisipan batch yang efisien, dan penyisipan batch normal dihapus setelah koneksi eksekusi conn = (koneksi) driverManager.getConnection (ConnectStr, username, kata sandi); Conn.setAutocommit (false); // Setel Pengajuan Manual Int Count = 0; PSTSTATEMENT PSTS = Conn.PrepareStatement (SQL); Garis string = null; Tanggal mulai = tanggal baru (); untuk (int i = 0; i <= 100000; i ++) {psts.setstring (1, i+"param1"); psts.setstring (2, i+"param2"); psts.setstring (3, i+"param3"); psts.setstring (4, i+"param4"); psts.setstring (5, i+"param5"); psts.addbatch (); // Tambahkan jumlah pemrosesan batch ++; } psts.executebatch (); // menjalankan pemrosesan batch Conn.Commit (); // Kirim tanggal akhir = tanggal baru (); System.out.println ("Kuantitas ="+Count); System.out.println ("Runtime ="+(end.getTime ()-begin.getTime ())); conn.close (); } public static void main (string [] args) {coba {new mysqlbatchutil (). dostore (); } catch (ClassNotFoundException e) {E.PrintStackTrace (); } catch (sqlexception e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); }}}Hasil tes:
Kuantitas = 100001
Waktu berjalan = 4725
Total 10W, dan waktu eksekusi membutuhkan waktu 47 detik.
Efisiensi ini masih belum tinggi dan tampaknya tidak mencapai efek yang diinginkan dan membutuhkan peningkatan lebih lanjut.
Parameter juga dapat ditambahkan ke string koneksi MySQL JDBC.
RERITEBATCHEDStatements = true
MySQL telah mematikan pemrosesan batch secara default, dan dihidupkan melalui parameter ini. Parameter ini dapat ditulis ulang pernyataan SQL yang dikirimkan ke database.
MenggunakanPerPrepSTMTS = false
Jika tidak diaktifkan (menggunakanPerPrepSTMTS = false), gunakan com.mysql.jdbc.preparedstatement untuk perakitan SQL lokal, dan akhirnya mengirimkannya ke DB. Ini adalah SQL terakhir yang telah diganti.
Berikut ini sedikit peningkatan, tambahkan pernyataan berikut ke string koneksi (hapus komentar di konstruktor kode):
connectStr += "? menggunakanPerRprepSTMTS = false & recriteBatchedStatements = true";
Hasil tes adalah sebagai berikut:
Kuantitas = 100001
Waktu berjalan = 1213
Dengan jumlah data yang sama, kali ini hanya butuh 12 detik untuk dieksekusi, yang menunjukkan bahwa efisiensi pemrosesan telah sangat ditingkatkan. Ha ha
Di atas adalah efisiensi uji menggunakan JDBC untuk memasukkan 10W potongan data ke dalam batch basis data MySQL. 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!