如何将 Saxon XSLT 连接到 Amazon AWS RDS 服务上的 Oracle 数据库
How to connect Saxon XSLT to Oracle database on Amazon AWS RDS service
我希望 运行 在 windows 平台上进行 XSLT 转换(Engine == Saxon EET v9-8-0-12J)并通过 SSL 连接到 RDS Oracle 数据库。
为什么?如何建立连接?
什么应该有效
以下转换在 2019 年有效,但在 2020 年无效。
<xsl:stylesheet
version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sql="http://saxon.sf.net/sql"
xmlns:java="http://saxon.sf.net/java-type"
xmlns:xyz="<redacted>"
exclude-result-prefixes="xs java xyz"
extension-element-prefixes="sql">
<xsl:output omit-xml-declaration="yes" indent="yes" encoding="utf-8" />
<xsl:strip-space elements="*" />
<xsl:param name="db" />
<xsl:param name="username" />
<xsl:param name="password" />
<xsl:variable name="connections">
<tns-entries>
<tns-entry name="EXP">
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCPS)(HOST = <redacted>)(PORT = <redacted>))
)
(CONNECT_DATA =
(SID = <redacted>)
)
(SECURITY = (SSL_SERVER_CERT_DN = "C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=<redacted>"))
)
</tns-entry>
</tns-entries>
<queries>
<query db="EXP" schema="<redacted>" cols="sysdate" view="dual" where="1=1" />
</queries>
</xsl:variable>
<xsl:variable name="jdbConnectionString"
select="concat('jdbc:oracle:thin:@', translate( normalize-space( $connections/tns-entries/tns-entry[@name=$db]/text()), ' ', ''))"/>
<xsl:variable name="schema" select="$connections/queries/query[@db=$db]/@schema" />
<xsl:variable name="cols" select="$connections/queries/query[@db=$db]/@cols" />
<xsl:variable name="view" select="$connections/queries/query[@db=$db]/@view" />
<xsl:variable name="where" select="$connections/queries/query[@db=$db]/@where" />
<xsl:variable name="connection" as="java:java.sql.Connection">
<sql:connect driver="oracle.jdbc.driver.OracleDriver"
database="{$jdbConnectionString}" user="{$username}" password="{$password}"/>
</xsl:variable>
<xsl:function name="xyz:sql" as="element(row)*">
<xsl:param name="columns" as="xs:string" />
<xsl:param name="view" as="xs:string" />
<xsl:param name="where-clause" as="xs:string" />
<sql:query
connection="$connection"
column="{$columns}"
table="{string-join( tokenize( $view, ',') ! concat( $schema, '.', normalize-space(.)), ',')}"
where="{$where-clause}"
row-tag="row"
column-tag="#auto" />
</xsl:function>
<xsl:template match="/">
<result>
<db name="{$db}"><xsl:value-of select="$jdbConnectionString" /></db>
<dataset><xsl:copy-of select="xyz:sql($cols,$view,$where)" /></dataset>
</result>
</xsl:template>
</xsl:stylesheet>
2020年对RDS数据库执行时,返回如下错误...
java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
在 Saxon XSLT 之外(使用 sqlplus.exe 等程序)可以毫无问题地连接到此数据库
上述转换也适用于本地数据库。
发生了什么变化
Oracle 的一些全局选项设置存储在名为 sqlnet.ora 的文件中。通常 Oracle 客户端会注意到此文件,但我怀疑 Saxon XSLT 利用的 java 层不遵守此文件。我可能对这个文件做了一些修改,这是我能想到的唯一改变的环境因素。
这可能是问题所在吗?
sqlnet.ora 文件内容
# SQLNET.ORA
# Version 1.2 9/2/2007
names.directory_path = (TNSNAMES)
names.default_domain = world
name.default_zone = world
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = <redacted>)))
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 1.2
SSL_CIPHER_SUITES = (<redacted>)
SSL_SERVER_DN_MATCH = OFF
由于公司安全策略,我无法打开 SSL_CLIENT_AUTHENTICATION,也无法打开 SSL_SERVER_DN_MATCH。 :-(
如有任何建议或有用的提示,我们将不胜感激。
我昨天刚看过 sql:connection 撒克逊语代码,恐怕已经过时了;最近 JDBC 建议使用使用 JNDI 注册的命名 DataSource
建立连接,但 Saxon 仍在使用旧方法使用数据库名称加上 JDBC 驱动程序 class 的名称。
如果您能够编写 Java 成功创建 JDBC 连接的代码,那么我建议您将该代码封装为扩展函数,并使用它代替 Saxon sql:connection
打电话。 (理想情况下,如果你成功了,请分享它!)
恐怕撒克逊 SQL 分机是第二 class 公民。它主要是由只需要解决简单问题的用户零碎贡献的,因此在覆盖范围上有点拼凑;此外,我们从来没有真正需要的那种测试套件,显示与不同平台上十几种不同数据库产品的连接。我们(在 Saxonica)对这些数据库产品的了解也不够深入,无法为用户提供解决特定于数据库问题的帮助。但是一旦你能连接上,它通常就可以正常工作了。
我希望 运行 在 windows 平台上进行 XSLT 转换(Engine == Saxon EET v9-8-0-12J)并通过 SSL 连接到 RDS Oracle 数据库。
为什么?如何建立连接?
什么应该有效
以下转换在 2019 年有效,但在 2020 年无效。
<xsl:stylesheet
version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sql="http://saxon.sf.net/sql"
xmlns:java="http://saxon.sf.net/java-type"
xmlns:xyz="<redacted>"
exclude-result-prefixes="xs java xyz"
extension-element-prefixes="sql">
<xsl:output omit-xml-declaration="yes" indent="yes" encoding="utf-8" />
<xsl:strip-space elements="*" />
<xsl:param name="db" />
<xsl:param name="username" />
<xsl:param name="password" />
<xsl:variable name="connections">
<tns-entries>
<tns-entry name="EXP">
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCPS)(HOST = <redacted>)(PORT = <redacted>))
)
(CONNECT_DATA =
(SID = <redacted>)
)
(SECURITY = (SSL_SERVER_CERT_DN = "C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=<redacted>"))
)
</tns-entry>
</tns-entries>
<queries>
<query db="EXP" schema="<redacted>" cols="sysdate" view="dual" where="1=1" />
</queries>
</xsl:variable>
<xsl:variable name="jdbConnectionString"
select="concat('jdbc:oracle:thin:@', translate( normalize-space( $connections/tns-entries/tns-entry[@name=$db]/text()), ' ', ''))"/>
<xsl:variable name="schema" select="$connections/queries/query[@db=$db]/@schema" />
<xsl:variable name="cols" select="$connections/queries/query[@db=$db]/@cols" />
<xsl:variable name="view" select="$connections/queries/query[@db=$db]/@view" />
<xsl:variable name="where" select="$connections/queries/query[@db=$db]/@where" />
<xsl:variable name="connection" as="java:java.sql.Connection">
<sql:connect driver="oracle.jdbc.driver.OracleDriver"
database="{$jdbConnectionString}" user="{$username}" password="{$password}"/>
</xsl:variable>
<xsl:function name="xyz:sql" as="element(row)*">
<xsl:param name="columns" as="xs:string" />
<xsl:param name="view" as="xs:string" />
<xsl:param name="where-clause" as="xs:string" />
<sql:query
connection="$connection"
column="{$columns}"
table="{string-join( tokenize( $view, ',') ! concat( $schema, '.', normalize-space(.)), ',')}"
where="{$where-clause}"
row-tag="row"
column-tag="#auto" />
</xsl:function>
<xsl:template match="/">
<result>
<db name="{$db}"><xsl:value-of select="$jdbConnectionString" /></db>
<dataset><xsl:copy-of select="xyz:sql($cols,$view,$where)" /></dataset>
</result>
</xsl:template>
</xsl:stylesheet>
2020年对RDS数据库执行时,返回如下错误...
java.sql.SQLException: Io exception: The Network Adapter could not establish the connection
在 Saxon XSLT 之外(使用 sqlplus.exe 等程序)可以毫无问题地连接到此数据库 上述转换也适用于本地数据库。
发生了什么变化
Oracle 的一些全局选项设置存储在名为 sqlnet.ora 的文件中。通常 Oracle 客户端会注意到此文件,但我怀疑 Saxon XSLT 利用的 java 层不遵守此文件。我可能对这个文件做了一些修改,这是我能想到的唯一改变的环境因素。
这可能是问题所在吗?
sqlnet.ora 文件内容
# SQLNET.ORA
# Version 1.2 9/2/2007
names.directory_path = (TNSNAMES)
names.default_domain = world
name.default_zone = world
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = <redacted>)))
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 1.2
SSL_CIPHER_SUITES = (<redacted>)
SSL_SERVER_DN_MATCH = OFF
由于公司安全策略,我无法打开 SSL_CLIENT_AUTHENTICATION,也无法打开 SSL_SERVER_DN_MATCH。 :-(
如有任何建议或有用的提示,我们将不胜感激。
我昨天刚看过 sql:connection 撒克逊语代码,恐怕已经过时了;最近 JDBC 建议使用使用 JNDI 注册的命名 DataSource
建立连接,但 Saxon 仍在使用旧方法使用数据库名称加上 JDBC 驱动程序 class 的名称。
如果您能够编写 Java 成功创建 JDBC 连接的代码,那么我建议您将该代码封装为扩展函数,并使用它代替 Saxon sql:connection
打电话。 (理想情况下,如果你成功了,请分享它!)
恐怕撒克逊 SQL 分机是第二 class 公民。它主要是由只需要解决简单问题的用户零碎贡献的,因此在覆盖范围上有点拼凑;此外,我们从来没有真正需要的那种测试套件,显示与不同平台上十几种不同数据库产品的连接。我们(在 Saxonica)对这些数据库产品的了解也不够深入,无法为用户提供解决特定于数据库问题的帮助。但是一旦你能连接上,它通常就可以正常工作了。