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&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&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

