You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Saxon 9.9.1升级至12.3后sql:connect连接异常求助

问题

Saxon 9.9.1版本中可正常建立SQL连接,但升级至12.3版本后出现无法排查的SQL连接错误。查阅文档发现9.9到12.3版本的唯一变化是连接中指定driver已被弃用。

运行环境为Jetty servlet,classpath已包含saxon-sql-12.3.jar和mysql-connector-java-8.0.22.jar。

连接代码如下:

<xsl:variable name="connection" select="sql:connect(map{'database':'jdbc:mysql://localhost:3306/database?useSSL=false&amp;serverTimezone=America/Los_Angeles','user':'username','password':'password','autoCommit':'1'}})"/>

开启TIMING后的错误日志(有时会出现驱动弃用警告,但未在sql:connect()的map中指定driver):

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser
Building tree for (unknown systemId) using class net.sf.saxon.tree.tiny.TinyBuilder
Tree built in 0.060333ms
Tree size: 3 nodes, 0 characters, 0 attributes
DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useSSL=false&serverTimezone=America/Los_Angeles")
   skipping: com.mysql.jdbc.Driver
   skipping: com.mysql.fabric.jdbc.FabricMySQLDriver
   skipping: com.mysql.cj.jdbc.Driver
   skipping: com.mysql.cj.jdbc.Driver
   skipping: com.mysql.cj.jdbc.Driver
   skipping: com.mysql.cj.jdbc.Driver
   trying com.mysql.cj.jdbc.Driver
getConnection returning com.mysql.cj.jdbc.Driver
java.lang.NullPointerException
    at java.base/java.util.Objects.requireNonNull(Objects.java:208)
    at net.sf.saxon.str.StringView.<init>(StringView.java:26)
    at net.sf.saxon.str.StringView.of(StringView.java:31)
    at net.sf.saxon.value.StringValue.<init>(StringValue.java:106)
    at net.sf.saxon.value.StringValue.<init>(StringValue.java:91)
    at com.saxonica.functions.sql.SQLFunctionSet.sqlQueryResult(SQLFunctionSet.java:64)
    at com.saxonica.functions.sql.SQLPreparedQueryFn.lambda$call$0(SQLPreparedQueryFn.java:67)
    at net.sf.saxon.functions.CallableFunction.call(CallableFunction.java:128)
    at net.sf.saxon.expr.DynamicFunctionCall$DynamicFunctionCallElaborator.lambda$elaborateForPull$2(DynamicFunctionCall.java:356)
    at net.sf.saxon.value.MemoClosure.makeSequence(MemoClosure.java:94)
    at net.sf.saxon.value.MemoClosure.iterate(MemoClosure.java:85)
    at net.sf.saxon.om.Sequence.materialize(Sequence.java:61)
    at net.sf.saxon.expr.elab.LocalVariableEvaluator.evaluate(LocalVariableEvaluator.java:31)
    at net.sf.saxon.expr.elab.LearningEvaluator.evaluate(LearningEvaluator.java:61)
    at net.sf.saxon.expr.UserFunctionCall.evaluateArguments(UserFunctionCall.java:616)
    at net.sf.saxon.expr.UserFunctionCall$UserFunctionCallElaborator.lambda$elaborateForPull$0(UserFunctionCall.java:742)
    at net.sf.saxon.expr.elab.PullElaborator.lambda$elaborateForBoolean$2(PullElaborator.java:65)
    at net.sf.saxon.functions.NotFn$NotFnElaborator.lambda$elaborateForBoolean$0(NotFn.java:129)
    at net.sf.saxon.expr.instruct.Choose$ChooseExprElaborator.lambda$elaborateForPush$10(Choose.java:1168)
    at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$1(Block.java:851)
    at net.sf.saxon.expr.LetExpression$LetExprElaborator.lambda$elaborateForPush$6(LetExpression.java:942)
    at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:393)
    at net.sf.saxon.trans.Mode.handleRuleNotNull(Mode.java:587)
    at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:521)
    at net.sf.saxon.trans.XsltController.applyTemplates(XsltController.java:684)
    at net.sf.saxon.s9api.Xslt30Transformer.applyTemplates(Xslt30Transformer.java:438)
分析与解决方案

从错误栈和日志信息来看,空指针出现在Saxon字符串处理环节,结合版本变更细节,可能的原因及解决办法如下:

  • 驱动类重复加载冲突
    日志显示多次跳过com.mysql.cj.jdbc.Driver,说明Jetty的classloader中存在多份MySQL驱动类,或旧版com.mysql.jdbc.Driver仍残留于classpath。驱动实例冲突会导致后续结果集处理时出现空值。
    解决:清理classpath,确保仅保留mysql-connector-java-8.0.22.jar,删除所有旧版驱动文件;检查Jetty共享库目录,避免驱动包重复放置。

  • 参数类型不兼容
    Saxon 12.x对sql:connect的参数类型校验更严格,你传入的autoCommit是字符串'1',9.9版本可能自动转换为布尔值,但12.x版本未正确处理,引发连接属性异常。
    解决:将autoCommit改为布尔值true,修改后的连接代码:

    <xsl:variable name="connection" select="sql:connect(map{'database':'jdbc:mysql://localhost:3306/database?useSSL=false&amp;serverTimezone=America/Los_Angeles','user':'username','password':'password','autoCommit':true})"/>
    
  • Saxon SQL扩展版本兼容问题
    虽然使用了saxon-sql-12.3.jar,但可能与Saxon主版本存在差异,或该版本SQL扩展存在已知bug。
    解决:尝试升级到Saxon 12.x最新补丁版本,或回退到12.0版本测试;确保Saxon主jar包与SQL扩展jar包版本完全一致。

  • JDBC URL参数异常
    驱动已成功获取连接,但后续处理出错,可能是URL参数导致结果集返回异常,比如时区设置不匹配或useSSL参数行为变化。
    解决:简化JDBC URL,先去掉非必要参数(如serverTimezone)测试连接,再逐步添加参数排查;确保URL参数格式符合MySQL 8.0驱动要求。

内容的提问来源于stack exchange,提问作者lschult2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:15:18