


Bagaimanakah java menggunakan pemintas pemacu MySQL untuk melaksanakan pengiraan sql yang memakan masa?
Latar Belakang
Satu keperluan syarikat ialah komponen log penjejakan pautan sedia ada syarikat harus menyokong pencetakan masa pelaksanaan SQL MySQL Kaedah biasa untuk melaksanakan penjejakan pautan adalah dengan melaksanakan rangka kerja atau alatan pihak ketiga antara muka pemintas atau antara muka penapis tidak terkecuali untuk MySQL Malah, ia hanya melaksanakan antara muka pemintas yang didorong oleh MySQL.
Pelaksanaan khusus
Saluran MySQL mempunyai versi yang berbeza, dan antara muka pemintas versi berbeza adalah berbeza, jadi anda perlu melaksanakan pemintas tindak balas mengikut versi berbeza pemacu MySQL yang anda gunakan , Seterusnya, kami akan memperkenalkan kaedah pelaksanaan MySQL saluran 5, 6, dan 8 masing-masing.
MySQL5
Di sini kami mengambil versi MySQL 5.1.18 sebagai contoh untuk melaksanakan antara muka StatementInterceptorV2
Logik pelaksanaan utama adalah dalam kaedah preProcess
dan postProcess
ini dua kaedah ialah sql Kaedah yang akan dilaksanakan sebelum dan selepas pelaksanaan Rangka kerja yang saya gunakan ialah log balik digunakan di sini untuk merekodkan cap waktu sebelum pelaksanaan SQL untuk melaksanakannya, dan kemudian dalam postProcess
Gunakan MDC.put("sql_exec_time", start);
dalam kaedah untuk mengambil masa yang direkodkan sebelum pelaksanaan sql, dan akhirnya menolak masa sebelum pelaksanaan sql daripada cap waktu semasa untuk mengira masa pelaksanaan sql. postProcess
import static net.logstash.logback.marker.Markers.append; import com.mysql.jdbc.Connection; import com.mysql.jdbc.ResultSetInternalMethods; import com.mysql.jdbc.Statement; import com.mysql.jdbc.StatementInterceptorV2; import com.redick.util.LogUtil; import java.sql.SQLException; import java.util.Properties; import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; /** * @author Redick01 */ @Slf4j public class Mysql5StatementInterceptor implements StatementInterceptorV2 { @Override public void init(Connection connection, Properties properties) throws SQLException { } @Override public ResultSetInternalMethods preProcess(String s, Statement statement, Connection connection) throws SQLException { String start = String.valueOf(System.currentTimeMillis()); MDC.put("sql_exec_time", start); log.info(LogUtil.customizeMarker(LogUtil.kLOG_KEY_TRACE_TAG, "sql_exec_before"), "开始执行sql"); return null; } @Override public boolean executeTopLevelOnly() { return false; } @Override public void destroy() { } @Override public ResultSetInternalMethods postProcess(String s, Statement statement, ResultSetInternalMethods resultSetInternalMethods, Connection connection, int i, boolean b, boolean b1, SQLException e) throws SQLException { long start = Long.parseLong(MDC.get("sql_exec_time")); long end = System.currentTimeMillis(); log.info(LogUtil.customizeMarker(LogUtil.kLOG_KEY_TRACE_TAG, "sql_exec_after") .and(append(LogUtil.kLOG_KEY_SQL_EXEC_DURATION, end - start)), "结束执行sql"); return null; } }
MDC.get("sql_exec_time")
MySQL6MySQL6 dan MySQL5 pada asasnya sama, tetapi antara muka tidak sama, letak kod terus
import static net.logstash.logback.marker.Markers.append; import com.mysql.cj.api.MysqlConnection; import com.mysql.cj.api.jdbc.Statement; import com.mysql.cj.api.jdbc.interceptors.StatementInterceptor; import com.mysql.cj.api.log.Log; import com.mysql.cj.api.mysqla.result.Resultset; import com.redick.util.LogUtil; import java.sql.SQLException; import java.util.Properties; import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; /** * @author Redick01 */ @Slf4j public class Mysql6StatementInterceptor implements StatementInterceptor { @Override public StatementInterceptor init(MysqlConnection mysqlConnection, Properties properties, Log log) { return null; } @Override public <T extends Resultset> T preProcess(String s, Statement statement) throws SQLException { String start = String.valueOf(System.currentTimeMillis()); MDC.put("sql_exec_time", start); log.info(LogUtil.customizeMarker(LogUtil.kLOG_KEY_TRACE_TAG, "sql_exec_before"), "开始执行sql"); return null; } @Override public boolean executeTopLevelOnly() { return false; } @Override public void destroy() { } @Override public <T extends Resultset> T postProcess(String s, Statement statement, T t, int i, boolean b, boolean b1, Exception e) throws SQLException { long start = Long.parseLong(MDC.get("sql_exec_time")); long end = System.currentTimeMillis(); log.info(LogUtil.customizeMarker(LogUtil.kLOG_KEY_TRACE_TAG, "sql_exec_after") .and(append(LogUtil.kLOG_KEY_SQL_EXEC_DURATION, end - start)), "结束执行sql"); return null; } }
MySQL8
Pintasan daripada MySQL8 dan MySQL5/6 Antara muka pemintas adalah berbeza lagi Antara muka pemintas MySQL8 ialah
Kaedah mengira masa pelaksanaan SQL adalah seperti berikut:import static net.logstash.logback.marker.Markers.append; import com.mysql.cj.MysqlConnection; import com.mysql.cj.Query; import com.mysql.cj.interceptors.QueryInterceptor; import com.mysql.cj.log.Log; import com.mysql.cj.protocol.Resultset; import com.mysql.cj.protocol.ServerSession; import com.redick.util.LogUtil; import java.util.Properties; import java.util.function.Supplier; import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; /** * @author Redick01 */ @Slf4j public class Mysql8QueryInterceptor implements QueryInterceptor { @Override public QueryInterceptor init(MysqlConnection mysqlConnection, Properties properties, Log log) { return null; } @Override public <T extends Resultset> T preProcess(Supplier<String> supplier, Query query) { String start = String.valueOf(System.currentTimeMillis()); MDC.put("sql_exec_time", start); log.info(LogUtil.customizeMarker(LogUtil.kLOG_KEY_TRACE_TAG, "sql_exec_before"), "开始执行sql"); return null; } @Override public boolean executeTopLevelOnly() { return false; } @Override public void destroy() { } @Override public <T extends Resultset> T postProcess(Supplier<String> supplier, Query query, T t, ServerSession serverSession) { long start = Long.parseLong(MDC.get("sql_exec_time")); long end = System.currentTimeMillis(); log.info(LogUtil.customizeMarker(LogUtil.kLOG_KEY_TRACE_TAG, "sql_exec_after") .and(append(LogUtil.kLOG_KEY_SQL_EXEC_DURATION, end - start)), "结束执行sql"); return null; } }
com.mysql.cj.interceptors.QueryInterceptor
Kaedah penggunaan Penggunaan MySQL5 dan 6 Dengan cara yang sama, tambahkan parameter
berikut pada url pautan pangkalan data, contohnya:url: jdbc:mysql://127.0.0.1:3316/log-helper?useUnicode=true&characterEncoding=UTF8&statementInterceptors=com.redick.support.mysql.Mysql5StatementInterceptor&serverTimezone=CST
statementInterceptors
MySQL8 menambah parameter pada url , sebagai contoh: url: jdbc:mysql://127.0.0.1:3316/log-helper?useUnicode=true&characterEncoding=UTF8&queryInterceptors=com.redick.support.mysql.Mysql8QueryInterceptor&serverTimezone=CST
queryInterceptors
Hasil ujianLog sebelum pelaksanaan sql
{"@timestamp":"2023-02-28T17:16:29.234+08:00","@version":"0.0.1","message":"开始执行sql","logger_name":"com.redick.support.mysql.Mysql5StatementInterceptor","thread_name":"http-nio-3321-exec-4","level":"INFO","level_value":20000,"traceId":"9ed930dc-4cc6-4719-bf33-9fcb618fd65b","spanId":"1","request_type":"getName","parentId":"0","trace_tag":"sql_exec_before"}
Log selepas pelaksanaan sql, bendera sql_duration mengambil masa 3ms untuk melaksanakan sql
Atas ialah kandungan terperinci Bagaimanakah java menggunakan pemintas pemacu MySQL untuk melaksanakan pengiraan sql yang memakan masa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Salah satu perubahan utama yang diperkenalkan dalam MySQL 8.4 (keluaran LTS terkini pada 2024) ialah pemalam "Kata Laluan Asli MySQL" tidak lagi didayakan secara lalai. Selanjutnya, MySQL 9.0 mengalih keluar pemalam ini sepenuhnya. Perubahan ini mempengaruhi PHP dan apl lain

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

Spring Boot memudahkan penciptaan aplikasi Java yang mantap, berskala, dan siap pengeluaran, merevolusi pembangunan Java. Pendekatan "Konvensyen Lebih Konfigurasi", yang wujud pada ekosistem musim bunga, meminimumkan persediaan manual, Allo

Stack adalah struktur data yang mengikuti prinsip LIFO (terakhir, pertama keluar). Dalam erti kata lain, elemen terakhir yang kita tambahkan pada timbunan adalah yang pertama dikeluarkan. Apabila kita menambah (atau menolak) unsur ke timbunan, mereka diletakkan di atas; iaitu di atas semua

Idea Intellij memudahkan pembangunan boot musim bunga, menjadikannya kegemaran di kalangan pemaju Java. Pendekatan konfigurasi konvensyen-over-configurationnya meminimumkan kod boilerplate, yang membolehkan pemaju memberi tumpuan kepada logik perniagaan. Tutorial ini menunjukkan dua meto

Panduan ini meneroka beberapa kaedah Java untuk membandingkan dua arraylists. Perbandingan yang berjaya memerlukan kedua -dua senarai mempunyai saiz yang sama dan mengandungi elemen yang sama. Kaedah untuk membandingkan ArrayLists di Java Beberapa pendekatan wujud untuk membandingkan AR

Pemantauan berkesan pangkalan data Redis adalah penting untuk mengekalkan prestasi optimum, mengenal pasti kemungkinan kesesakan, dan memastikan kebolehpercayaan sistem secara keseluruhan. Perkhidmatan Pengeksport Redis ialah utiliti teguh yang direka untuk memantau pangkalan data Redis menggunakan Prometheus. Tutorial ini akan membimbing anda melalui persediaan dan konfigurasi lengkap Perkhidmatan Pengeksport Redis, memastikan anda mewujudkan penyelesaian pemantauan dengan lancar. Dengan mengikuti tutorial ini, anda akan mencapai persediaan pemantauan yang beroperasi sepenuhnya untuk memantau metrik prestasi pangkalan data Redis anda dengan berkesan.
