Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过JDBC通过SID访问oracle数据库,无需主机:端口_Java_Oracle_Jdbc - Fatal编程技术网

Java 通过JDBC通过SID访问oracle数据库,无需主机:端口

Java 通过JDBC通过SID访问oracle数据库,无需主机:端口,java,oracle,jdbc,Java,Oracle,Jdbc,当我寻找如何通过JDBC连接到oracle数据库的信息时,我只找到了显示如何连接到已知主机的相同解决方案:端口。我必须传递这个连接字符串 jdbc:oracle:thin:[user/password]@[host][:port]:SID 对于JDBC,这是有效的 protected Connection connect() { Connection conn; try { Class.forName(oracle.jdbc.OracleDriver

当我寻找如何通过JDBC连接到oracle数据库的信息时,我只找到了显示如何连接到已知主机的相同解决方案:端口。我必须传递这个连接字符串

 jdbc:oracle:thin:[user/password]@[host][:port]:SID
对于JDBC,这是有效的

protected Connection connect()
{
    Connection conn;

    try
    {
        Class.forName(oracle.jdbc.OracleDriver.class.getCanonicalName());
    }
    catch (ClassNotFoundException e)
    {
        return null;
    }

    try
    {
        conn = DriverManager.getConnection("jdbc:oracle:thin:@1.1.1.1:1536:sid", "user", "passwd");
    }
    catch (SQLException e)
    {
        return null;
    }

    return conn;
}

但这种方法的问题是,我必须找出数据库位于哪个主机:端口。当我使用诸如
PL/sqldeveloper
或其他数据库工具时,他们不需要这个。系统只会提示用户输入数据库名称,但该工具仍可以以某种方式进行连接。所以我想知道这是怎么做到的。目前,我通过要求
tnsping
位于路径中来实现这一点,并且在我的助手类(上面的示例代码中未显示)中(该类提供连接URL),我调用
tnsping
并解析输出。这真的不是一个好方法,我想知道是否有一种正确的连接方式。

使用普通的JDBC(瘦驱动程序)是无法做到的。您可以尝试使用OCI,它可以理解TNS条目。

对于给定的ORACLE\u SID,SQL Developer之类的数据库工具可以从位于
$ORACLE\u HOME/network/admin/
tnsname.ora
文件中获取其余信息。此文件包含其余的连接信息,如

ORA11 =
 (DESCRIPTION = 
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
   )
 (CONNECT_DATA =
   (SERVICE_NAME = ORA11)
 )
)
JDBC驱动程序不会查找此文件,因此不会仅通过提供SID进行连接

参考资料:

这里没有魔法
tnsping
在本地
tnsnames.ora
文件中搜索ip:port。你也可以。是的,我当然也可以。我不是在要求一个替代方法来访问这个,我想知道是否有一个官方的方式来做这件事。直接解析tnsping oputput或tnsnames并没有什么不同,这不是一种“替代”方法。这是唯一的办法。您可以手动读取
tnsnames.ora
,也可以请求外部程序(如
tnsping
)为您执行此操作。@EgorSkriptunoff,谢谢,这对我来说并不完全清楚,我认为我遗漏了一些内容。您能提供更多详细信息吗?我尝试使用oci连接字符串,但现在在java.library.path中出现以下错误
无ocijdbc11
@Devlous:这需要path()中的Oracle客户端DLL。坦白地说,您对当前的解决方案很满意。好的,谢谢!我认为应该有更好的方法来处理oracle配置文件,但如果是这样的话