如何将 JDBC 连接到 tns oracle
Posted
技术标签:
【中文标题】如何将 JDBC 连接到 tns oracle【英文标题】:How to connect JDBC to tns oracle 【发布时间】:2013-11-01 09:40:34 【问题描述】:我可以使用 tns 文件从 plsql 连接到数据库
现在我想使用 JDBC 从我的 Java 连接到数据库。
我尝试了什么:
我搜索谷歌,我发现我必须使用这个连接字符串:
"jdbc:oracle:thin:@//host:port))/tnsfile)";
我的计算机名称是 myPC
tnsfile中写入的端口是5151
所以我尝试了这个连接字符串
"jdbc:oracle:thin:@//myPC:5151))/tnsfile"
但我得到了这个异常
java.sql.SQLRecoverableException: IO ERROR: SO Exception was generated
我做错了什么?
如何使用 tns 文件将我的 JDBC 连接到数据库?
【问题讨论】:
【参考方案1】:您必须设置一个名为 oracle.net.tns_admin
的属性以指向包含您的 tnsnames.ora
文件的文件夹的位置。然后在 @
登录 DB URL 之后指定该文件中的条目。检查下面的示例。你可以在这里找到更多信息:Data sources and URLs - Oracle Documentation
import java.sql.*;
public class Main
public static void main(String[] args) throws Exception
System.setProperty("oracle.net.tns_admin", "C:/app/product/11.2.0/client_1/NETWORK/ADMIN");
String dbURL = "jdbc:oracle:thin:@ENTRY_FROM_TNSNAMES";
Class.forName ("oracle.jdbc.OracleDriver");
Connection conn = null;
Statement stmt = null;
try
conn = DriverManager.getConnection(dbURL, "your_user_name", "your_password");
System.out.println("Connection established");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT dummy FROM dual");
if (rs.next())
System.out.println(rs.getString(1));
catch (Exception e)
e.printStackTrace();
finally
if (stmt != null) try stmt.close(); catch (Exception e)
if (conn != null) try conn.close(); catch (Exception e)
来自tnsnames.ora
文件的示例条目:
my_net_service_name= (描述= (地址=(这里的一些地址)) (连接数据= (SID=some_SID_name)))
my_net_service_name
字符串是您必须在我的 Java 示例中替换 ENTRY_FROM_TNSNAMES
的字符串。
【讨论】:
首先,我使用的是eclipse,其次,@ENTRY_FROM_TNSNAMES
是什么?它是我的 tnsfile 的名称吗?
您使用的 IDE 无关紧要。请阅读此处的 tnsnames.ora:About tnsnames.ora file 基本上,如果您(如您所述)想使用 tnsnames.ora 文件进行连接,则必须将 ENTRY_FROM_TNSNAMES
替换为来自 @987654335 的 net service names
之一@ 文件。查看我编辑的答案以获取示例。
一个小评论。 tnsnames.ora
也支持 include
指令。这不是由 JDBC 驱动程序实现的。几年前报告了一个错误报告。
@Przemyslaw Kruglej - 优秀的解决方案。它对我来说工作正常。我在这里有一个问题,因为我在本地计算机上工作,该计算机在 WindowsXP 上运行,并且我们的代码部署在服务器(UNIX 机器)中。我可以硬编码“tns_admin”路径,如果我在 UNIX 框中部署应用程序,则会失败/抛出异常。我们是否有任何其他替代方案,而不是在上述解决方案中硬编码 tns_admin 路径?请帮助我
@DineshMailapur 有几个选项。您可以在命令行中设置路径并使用不同的脚本来运行您的应用程序 - 检查this thread 以了解如何在命令行中设置属性。或者,您可以在每个系统(win/unix)中设置具有相同名称的环境变量并在运行程序时获取其值:检查this thread。最后,您可以从某个配置文件中读取路径。【参考方案2】:
与其硬编码 tnsnames.ora 的路径,不如从环境中找到它:
public static void setTnsAdmin()
String tnsAdmin = System.getenv("TNS_ADMIN");
if (tnsAdmin == null)
String oracleHome = System.getenv("ORACLE_HOME");
if (oracleHome == null)
return; //failed to find any useful env variables
tnsAdmin = oracleHome + File.separatorChar + "network" + File.separatorChar + "admin";
System.setProperty("oracle.net.tns_admin", tnsAdmin);
【讨论】:
【参考方案3】:尝试以下方法:
System.setProperty("oracle.net.tns_admin", PATH_TO_TNSNAMES.ORA);
Class.forName ("oracle.jdbc.OracleDriver");
dbUrl = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST="+IPHOST+")(PORT="+PORT+"))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME="+DBNAME+")))"
conn = DriverManager.getConnection(dbUrl, USERNAME, PASSWORD);
确保拥有最新版本的 ojdbc.jar
【讨论】:
由于您的 JDBC 连接字符串中有完整的连接描述,因此您不必向 oracle.net.tns_admin 注册系统属性。实际上,您正在直接连接省略 tnsnames.ora 文件。以上是关于如何将 JDBC 连接到 tns oracle的主要内容,如果未能解决你的问题,请参考以下文章