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

在oXygen与eXist-db中配置Saxon连接MySQL无结果求助

在eXist-db中使用Saxon连接MySQL时sql:execute()无结果的排查建议

我在oXygen和eXist-db环境中配置Saxon连接MySQL时遇到问题:代码无报错且能获取连接对象(说明从my.cnf提取的配置字段有效),但sql:execute()未返回任何结果,恳请提供解决建议。

我的XQuery代码:

xquery version "3.1";
declare namespace transform="http://exist-db.org/xquery/transform";

let $xml := <root/>
let $xsl := <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:file="http://expath.org/ns/file"
    xmlns:wq="https://winequest.com"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:sql="http://saxon.sf.net/sql"
    exclude-result-prefixes="file wq xs map sql"
    version="3.0" expand-text="yes">
    <xsl:mode on-no-match="shallow-copy"/>
    
    <xsl:template match="/">
        <xsl:variable name="cnf" select="file:read-text('/etc/my.cnf')"/>
        <xsl:variable name="client" select="$cnf => replace('^.*\[client\]', '', 's') => replace('\[[^\]]+\].*$', '', 's')" as="xs:string"/>
        <xsl:variable name="host" select="analyze-string($client, 'host\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
        <xsl:variable name="database" select="analyze-string($client, 'database\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
        <xsl:variable name="user" select="analyze-string($client, 'user\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
        <xsl:variable name="password" select="analyze-string($client, 'password\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
        <xsl:variable name="connection-map" select="map{
            'database':'jdbc:mysql://'||$host||':3306/'||$database||'?serverTimezone=America/Los_Angeles',
            'driver':'com.mysql.jdbc.Driver',
            'user':$user,
            'password':$password,
            'autoCommit':true()
        }"/>
        <xsl:variable name="connection" select="sql:connect($connection-map)"/>
        <sql-results>
            <xsl:sequence select="sql:execute($connection, 'SHOW DATABASES')"/>
        </sql-results>
    </xsl:template>
</xsl:stylesheet>

let $parameters := 
    <parameters>
        <param name="exist:stop-on-error" value="yes"/>
    </parameters>

let $config := 
    <configuration xmlns="http://saxon.sf.net/ns/configuration">
        <xslt>
            <extensionElement namespace="http://saxon.sf.net/sql" factory="net.sf.saxon.option.sql.SQLElementFactory"/>
        </xslt>
    </configuration>

let $results := transform:transform($xml, $xsl, $parameters, $config, ())
return $results

解决建议:

  • 校验JDBC驱动兼容性
    你使用的com.mysql.jdbc.Driver是MySQL旧版驱动类名,MySQL 8.0及以上版本建议改用com.mysql.cj.jdbc.Driver。同时要确认eXist-db的lib目录中已放置对应版本的mysql-connector-java包,版本不匹配可能导致执行无返回结果。

  • 替换SQL执行函数
    Saxon的sql:execute()更适合执行DDL/DML语句,对于SHOW DATABASES这类查询语句,改用sql:query()函数专门处理结果集返回,修改后的代码片段:

    <sql-results>
        <xsl:sequence select="sql:query($connection, 'SHOW DATABASES')"/>
    </sql-results>
    
  • 添加调试输出确认参数
    在XSLT模板中增加调试节点,输出连接参数和用户信息,确认配置是否正确:

    <debug-info>
        <jdbc-url>{$connection-map?database}</jdbc-url>
        <db-user>{$user}</db-user>
    </debug-info>
    

    同时查看eXist-db的系统日志,排查Saxon SQL扩展是否有隐性错误被忽略。

  • 验证数据库权限与基础查询
    确认当前数据库用户拥有SHOW DATABASES的权限,尝试执行简单的SELECT 1语句测试是否能返回结果,排除SQL语句本身的问题:

    <xsl:sequence select="sql:query($connection, 'SELECT 1 AS test')"/>
    
  • 确认Saxon扩展部署配置
    确保net.sf.saxon.option.sql.SQLElementFactory对应的Saxon SQL扩展包已正确部署到eXist-db,并且命名空间http://saxon.sf.net/sql拼写无误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:58:14