如何使用tnsname从Ant连接到Oracle数据库?

6
我正在寻找类似于Ant sql任务的东西,但它将接受以下格式的JDBC URL:
jdbc:oracle:thin:@TNS_NAME
一个可能的方法似乎是编写自己的Ant任务,使用OracleDataSource创建连接,但是否有一种直接在Ant中完成这个任务的方法?
编辑: 感谢大家迄今为止的回复。如果我更详细地解释一下我遇到的错误,希望能有所帮助。
我的Ant任务如下所示:
<target name="MyTarget" >
    <property name="oracle.net.tns_admin" value="/opt/oracle/product/10.2.0.1/NETWORK/ADMIN" />
    <property name="jdbc.driver" value="ojdbc5.jar" />
    <property name="jdbc.i18n.support" value="orai18n.jar" />
    <property name="jdbc.driver.class" value="oracle.jdbc.OracleDriver" />
    <path id="sql.class.path">
        <pathelement location="${jdbc.driver}" />
        <pathelement location="${jdbc.i18n.support}" />
    </path>

    <sql driver="${jdbc.driver.class}" url="jdbc:oracle:thin:@THE_TNS_NAME" userid="USER" password="PASSWORD" classpathref="sql.class.path" >
        <![CDATA[
        #SOME ARBITRARY SQL HERE
        ]]>
    </sql>
</target>

使用以下方式会出现错误:

java.sql.SQLException: Io异常:指定的主机未知

将url替换为“jdbc:oracle:thin:@HOST:PORT:INSTANCE”即可正常工作。我也可以使用tnsping命令测试上述使用的TNS名称,所以我知道它是有效的。


这应该只需要使用通常的Ant sql任务就可以了,不是吗?以那种方式使用有问题吗? - Stobor
如果它能够正常工作就太完美了,但我一定是做错了什么。我已经更新了我的Ant脚本,是否有错误? - zakvdm
你是连接Oracle还是MySQL? - Bhavik Ambani
4个回答

7

今天我在处理这个问题时发现了缺少的部分。需要将TNS位置设置为系统属性,如此处所示:Oracle thin JDBC to TNS name

要建立与TNS别名(tnsname)的Oracle thin JDBC连接,请确保将oracle.net.tns_admin系统属性传递给JVM。它的值应该是您的tnsnames.ora文件所在的目录。之后,您可以在JDBC URL中使用TNS别名代替主机名。

例如,如果您尝试连接到jdbc:oracle:thin:@MYDB,它在您的tnsnames.ora文件中,您将收到一个SQLException,其中详细消息为Io exception: Unknown host specified。如果您使用-Doracle.net.tns_admin=/oracle/10g/NETWORK/ADMIN启动JVM或在启动后使用System.setProperty(String,String),则可以成功建立连接。

这样做后,我能够仅使用TNS别名成功连接。


谢谢你的回答!我遇到这个问题已经很久了,以至于我几乎记不清细节了,但是你的回答看起来非常有希望,:) - zakvdm

1

你确定是NETWORK/ADMIN而不是network/admin吗?

Unix文件系统通常区分大小写 -(假设它在Unix上)。


你说得很对,实际上是“network/admin”。然而,我已经尝试了两种方式,但没有任何区别。我在想是否有更好的方法将属性传递给 SQL 任务(当我调用 Java 目标时,我使用了一个“sysproperty”,但 SQL 任务似乎不支持这个...)。 - zakvdm

0
如果您的意思是想要使用 tnsnames.ora 而不是 thin driver 的“厚”连接,那么您可以在 xml 文件中包装一个对 sqlplus 的调用:
<target name="myTarget">
  <!-- login.sql should have sqlcode exit so failonerror will fail build -->
  <exec executable="sqlplus" failonerror="true">
        <arg value="${userid}/${password}@${tnsalias}"/>
        <arg value="@myScript"/>
  </exec>
</target>

...是基本的想法。

[其中userid,password和tnsalias在您的属性文件中定义]

这显然意味着您至少需要安装Instant Client堆栈。


0

这个链接在过去对我非常有用,但在这种特定情况下,我正在尝试从Ant内部连接。我仍然需要指定oracle.net.tns_admin系统属性吗?如果是这样,我该怎么做呢?我已经更新了我的问题,附上了我目前的使用方式。感谢您的帮助。 - zakvdm
我认为是这样的。你可以这样做:<sysproperty key="test.property" value="blue" />这行代码是从这里复制过来的:http://ideoplex.com/id/372/setting-java-system-properties-with-ant - Jens Schauder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接