如何将Saxon XSLT连接到Amazon AWS RDS服务上的Oracle数据库

问题描述 投票:0回答:1

我希望在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。 :-(

任何建议或有用的提示,将不胜感激。

oracle saxon
1个回答
0
投票

我昨天刚刚看过Saxon的sql:connection代码,我担心它已经过时了;如今,JDBC建议使用通过JNDI注册的命名DataSource建立连接,但是Saxon仍在使用旧方法,即使用数据库名称加上JDBC驱动程序类的名称。

如果能够编写成功创建JDBC连接的Java代码,则建议您将该代码包装为扩展函数,并使用它代替Saxon sql:connection调用。 (理想情况下,如果可以使用,请分享!)

恐怕Saxon SQL扩展名是二等公民。它主要是由只需要解决简单问题的用户零星提供的,因此在覆盖范围方面有些错综复杂;此外,我们从来没有真正需要的那种测试套件,它显示了在不同平台上与十二种不同数据库产品的连接。我们(在Saxonica)对这些数据库产品也没有足够的了解,无法为用户提供有关数据库特定问题的大量帮助。但是一旦建立连接,它通常就可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.