当前位置: 首页 > news >正文

李光辉:营销型企业网站建设的指导思想是什么?宁波搜索引擎优化seo

李光辉:营销型企业网站建设的指导思想是什么?,宁波搜索引擎优化seo,wordpress 框架,建设医院网站ppt文章目录背景具体实现MySQL5MySQL6MySQL8使用方法测试结果背景 公司的一个需求,公司既有的链路追踪日志组件要支持MySQL的sql执行时间打印,要实现链路追踪常用的手段就是实现第三方框架或工具提供的拦截器接口或者是过滤器接口,对于MySQL也不…

文章目录

    • 背景
    • 具体实现
      • MySQL5
      • MySQL6
      • MySQL8
      • 使用方法
      • 测试结果

背景

    公司的一个需求,公司既有的链路追踪日志组件要支持MySQL的sql执行时间打印,要实现链路追踪常用的手段就是实现第三方框架或工具提供的拦截器接口或者是过滤器接口,对于MySQL也不例外,实际上就是实现了MySQL驱动的拦截器接口而已。

具体实现

    MySQL的渠道有不同的版本,不同版本的拦截器接口是不同的,所以要针对你所使用的不同版本的MySQL驱动去实现响应的拦截器,接下来分别介绍下MySQL渠道5,6,8版本的实现方式。

MySQL5

    这里以MySQL渠道5.1.18版本为例实现,实现StatementInterceptorV2接口,主要实现逻辑在preProcesspostProcess方法,这两个方法是sql执行前后要执行的方法,我所使用的框架是logback,这里使用MDC来记录sql执行前的一个时间戳,代码在postProcess方法MDC.put("sql_exec_time", start);,自己也可以使用ThreadLocal等来实现,然后在postProcess方法中使用MDC.get("sql_exec_time")将记录的sql执行前的时间取出来,最后再用当前时间戳减去sql执行前的时间,就算出了sql执行的时间。

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 {@Overridepublic void init(Connection connection, Properties properties) throws SQLException {}@Overridepublic 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;}@Overridepublic boolean executeTopLevelOnly() {return false;}@Overridepublic void destroy() {}@Overridepublic 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;}
}

MySQL6

    MySQL6和MySQL5基本一样,只是接口不是同一个,直接放代码

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 {@Overridepublic StatementInterceptor init(MysqlConnection mysqlConnection, Properties properties,Log log) {return null;}@Overridepublic <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;}@Overridepublic boolean executeTopLevelOnly() {return false;}@Overridepublic void destroy() {}@Overridepublic <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

    MySQL8和MySQL5/6的拦截器接口又不一样了,MySQL8的拦截器接口是com.mysql.cj.interceptors.QueryInterceptor,统计sql执行时间的方式还是一样的,代码如下:

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 {@Overridepublic QueryInterceptor init(MysqlConnection mysqlConnection, Properties properties, Log log) {return null;}@Overridepublic <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;}@Overridepublic boolean executeTopLevelOnly() {return false;}@Overridepublic void destroy() {}@Overridepublic <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;}
}

使用方法

    MySQL5和6的使用方式一样,在数据库链接的url中增加如下statementInterceptors参数,例如:

    url: jdbc:mysql://127.0.0.1:3316/log-helper?useUnicode=true&characterEncoding=UTF8&statementInterceptors=com.redick.support.mysql.Mysql5StatementInterceptor&serverTimezone=CST

    MySQL8则是在url中增加queryInterceptors参数,例如:

    url: jdbc:mysql://127.0.0.1:3316/log-helper?useUnicode=true&characterEncoding=UTF8&queryInterceptors=com.redick.support.mysql.Mysql8QueryInterceptor&serverTimezone=CST

测试结果

    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"}

    sql执行后日志,sql_duration标识执行sql耗时3ms

{"@timestamp":"2023-02-28T17:16:29.237+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_after","sql_duration":3}

具体实现代码参考基于Spring AOP + logstash-logback-encoder日志链路追踪工具LogHelper

http://www.15wanjia.com/news/12634.html

相关文章:

  • 网站有二维码吗图片外链生成工具在线
  • 百度怎样才能搜到自己的网站seo排名优化厂家
  • linux上搭建网站百度营销平台
  • 新站网站如何做Seoseo黑帽优化
  • 找源码的网站网站seo服务商
  • 厦门电子商务网站建设免费培训seo网站
  • 做网站都有跳转链接宁波做网站的公司
  • 网站管理系统改不了的seo工具不包括
  • 如何做招聘网站效果分析专业seo优化推广
  • 页面做的好看的网站网站推广怎么做有效果
  • 网站接入协议及接入商资质网络热词大全
  • 做乒乓球网站的图片大全金华网站建设
  • worldpress 建站seo搜索引擎优化是
  • 山西笑傲网站建设推广seo免费诊断电话
  • 做网站数据库设计企业网站有什么
  • 太平洋保险网站做的这么烂b站好看的纪录片免费
  • 建立网站一般包括什么等方式广东网站seo营销
  • 手机网站 尺寸深圳搜索引擎优化推广便宜
  • 沈阳德泰诺网站建设seo还有前景吗
  • 网站开发论文结论怎么写郑州专业的网站公司
  • 潮州市住房和城乡建设局网站如何优化网络速度
  • 三水网站建设广州头条新闻最新
  • wordpress 改域名百度问答优化
  • 新泰网站制作网络开发
  • 动漫网站设计方案搜索引擎优化与关键词的关系
  • 网站销售策划个人开发app去哪里接广告
  • 做的好的外贸网站怎么做百度关键词排名
  • 小程序建站平台哪个好一般的电脑培训班要多少钱
  • 白城学习做网站的学校深圳百度开户
  • 青海网站建设设计南京seo排名