在mybatis上全局添加具有分布式跟踪ID的sql注释

问题描述 投票:0回答:1

是否有一种很酷的方法来添加Mybatis上的sql注释,如下所示。

SELECT * FROM users; /* TraceID: foo-bar-baz */

我想在对所有已执行的SQL进行分布式跟踪的上下文中添加带有TraceID / RequestID / CorrelationID的sql注释。通过此注释,可以从慢查询的注释中识别交易。

我找到了Interceptor API,但似乎无法添加commnet。

我似乎可以通过这种方式使用类似于thymeleaf-scripting的脚本。但是,我们需要在所有sql中添加sql注释...

任何建议将不胜感激。

mybatis
1个回答
1
投票

就您而言,自定义语言驱动程序可能是一个很好的选择。

实施

下面的实现与默认的XMLLanguageDriver基本相同。

XMLLanguageDriver

附加的注释包含调用静态方法的OGNL表达式。此表达式在运行时求值。

配置

要全局注册自定义语言驱动程序,您需要在配置中设置import org.apache.ibatis.builder.xml.XMLMapperEntityResolver; import org.apache.ibatis.mapping.SqlSource; import org.apache.ibatis.parsing.PropertyParser; import org.apache.ibatis.parsing.XNode; import org.apache.ibatis.parsing.XPathParser; import org.apache.ibatis.scripting.defaults.RawSqlSource; import org.apache.ibatis.scripting.xmltags.DynamicSqlSource; import org.apache.ibatis.scripting.xmltags.TextSqlNode; import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; import org.apache.ibatis.session.Configuration; public class CommentLanguageDriver extends XMLLanguageDriver { @Override public SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType) { // Append comment script.getNode().setTextContent( script.getNode().getTextContent() + getComment()); return super.createSqlSource(configuration, script, parameterType); } @Override public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) { if (script.startsWith("<script>")) { XPathParser parser = new XPathParser(script, false, configuration.getVariables(), new XMLMapperEntityResolver()); return createSqlSource(configuration, parser.evalNode("/script"), parameterType); } else { // Append comment script = PropertyParser.parse(script + getComment(), configuration.getVariables()); TextSqlNode textSqlNode = new TextSqlNode(script); if (textSqlNode.isDynamic()) { return new DynamicSqlSource(configuration, textSqlNode); } else { return new RawSqlSource(configuration, script, parameterType); } } } private String getComment() { // OGNL expression invoking the static method return " /* ${@org.slf4j.MDC@get(\"requestid\")} */"; } }

defaultScriptingLanguage

如果使用的是mybatis-spring-boot-starter,请将以下行添加到application.properties。

<settings>
  <setting name="defaultScriptingLanguage"
    value="pkg.CommentLanguageDriver" />
</settings>
© www.soinside.com 2019 - 2024. All rights reserved.