在oXygen与eXist-db中配置Saxon连接MySQL无结果求助
我在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

