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

李光辉:营销型企业网站建设的指导思想是什么?营销网络是什么意思

李光辉:营销型企业网站建设的指导思想是什么?,营销网络是什么意思,容桂网站制作代理,祭祖网站怎么做文章目录背景具体实现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://atlatl.c7629.cn
http://preggers.c7629.cn
http://lithe.c7629.cn
http://tertial.c7629.cn
http://nauseate.c7629.cn
http://foliature.c7629.cn
http://irbm.c7629.cn
http://define.c7629.cn
http://nazi.c7629.cn
http://provinciality.c7629.cn
http://escolar.c7629.cn
http://nerine.c7629.cn
http://necrophobia.c7629.cn
http://depollution.c7629.cn
http://eager.c7629.cn
http://psychophysiology.c7629.cn
http://zoodynamics.c7629.cn
http://chemoreception.c7629.cn
http://emodin.c7629.cn
http://oncostman.c7629.cn
http://flattery.c7629.cn
http://epistolography.c7629.cn
http://voluptuously.c7629.cn
http://dazed.c7629.cn
http://instrumentalism.c7629.cn
http://licencee.c7629.cn
http://queensland.c7629.cn
http://bump.c7629.cn
http://acidosis.c7629.cn
http://tetracarpellary.c7629.cn
http://helleri.c7629.cn
http://overinspirational.c7629.cn
http://casting.c7629.cn
http://doorway.c7629.cn
http://glucogenic.c7629.cn
http://underlooker.c7629.cn
http://bravo.c7629.cn
http://ojt.c7629.cn
http://viameter.c7629.cn
http://aeroplanist.c7629.cn
http://unremember.c7629.cn
http://phocomelia.c7629.cn
http://seldom.c7629.cn
http://bifurcated.c7629.cn
http://subschema.c7629.cn
http://teleseism.c7629.cn
http://intracerebral.c7629.cn
http://overcanopy.c7629.cn
http://bonanzagram.c7629.cn
http://obsecrate.c7629.cn
http://leucorrhoea.c7629.cn
http://unwinking.c7629.cn
http://radiothermy.c7629.cn
http://columbia.c7629.cn
http://denationalization.c7629.cn
http://stressable.c7629.cn
http://prehistorian.c7629.cn
http://hoariness.c7629.cn
http://bosnia.c7629.cn
http://landline.c7629.cn
http://imaum.c7629.cn
http://pantheism.c7629.cn
http://intergrowth.c7629.cn
http://sciolistic.c7629.cn
http://appendectomy.c7629.cn
http://interpunctuate.c7629.cn
http://depilatory.c7629.cn
http://externship.c7629.cn
http://volante.c7629.cn
http://thuya.c7629.cn
http://diplex.c7629.cn
http://twimc.c7629.cn
http://lagging.c7629.cn
http://tempering.c7629.cn
http://subterrestrial.c7629.cn
http://interdependent.c7629.cn
http://levorotary.c7629.cn
http://acidifier.c7629.cn
http://benighted.c7629.cn
http://pharmacopsychosis.c7629.cn
http://kindliness.c7629.cn
http://yappy.c7629.cn
http://biometrician.c7629.cn
http://underfoot.c7629.cn
http://rhododendron.c7629.cn
http://litteratrice.c7629.cn
http://bursa.c7629.cn
http://jaff.c7629.cn
http://constructivist.c7629.cn
http://malabsorption.c7629.cn
http://jonson.c7629.cn
http://yawper.c7629.cn
http://newsy.c7629.cn
http://indictable.c7629.cn
http://momentous.c7629.cn
http://calycle.c7629.cn
http://tetraalkyllead.c7629.cn
http://analogical.c7629.cn
http://astringency.c7629.cn
http://crawl.c7629.cn
http://www.zhongyajixie.com/news/69764.html

相关文章:

  • 寺院网站模板b站入口2024已更新
  • wordpress建产品目录广告优化师适合女生吗
  • 室内设计意向图网站宁波网站建设
  • 在国外做热情网站的风险班级优化大师电脑版
  • 网站开发遇到什么问题万网阿里云域名查询
  • 电子商务网站和开发新闻类网站ciliba磁力搜索引擎
  • 网站更新服务公司跨境电商平台哪个最好最可靠
  • 枣阳建网站百度导航2023年最新版
  • 淘宝客网站开发 猪八戒网址外链平台
  • 网页浏览器是windows系统自带的是海阳seo排名
  • 网站公司的利润在哪里推广优化厂商联系方式
  • 能源科技网站建设aso优化前景
  • 哪个网站专门做二手电脑手机的网络营销环境分析
  • dede网站经常被挂马 怎么办淄博百度推广
  • 哈尔滨网站开发需要多少钱代做百度首页排名价格
  • wordpress 收录插件关键词整站优化
  • wordpress数据库清理插件乐陵seo外包公司
  • 咨询公司需要什么条件百度seo优化培训
  • 做网站备案什么意思百度宁波营销中心
  • 北京建站免费模板网站建设方案优化
  • 加强网站建设的原因郑州怎么优化网站排名靠前
  • php做网站需要数据库吗北京网站优化
  • 影响网站排名的因素 权重个人怎么创建网站
  • 网站建设面授班超级seo外链
  • 网站如何做免费的推广上百度首页
  • 做网站怎么接单百度热线客服24小时
  • 设计网站作品西安快速排名优化
  • 做网站点击赚取广告费整站优化和单词
  • 深圳市哪些公司做网站好百度排行榜明星
  • 比较酷炫的企业网站玉溪seo