无法从 Java 连接到 Oracle DB - ORA-12560:TNS:协议适配器错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3660532/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Cannot connect to Oracle DB from Java - ORA-12560: TNS:protocol adapter error
提问by dferraro
This is my first Java application I am creating (using Eclipse IDE) and the second Oracle based app (I'm a .NET/MSSQL guy for years). The first Oracle app I wrote in .NET did not have any issues, and I'm trying to connect to the same server.
这是我创建的第一个 Java 应用程序(使用 Eclipse IDE)和第二个基于 Oracle 的应用程序(我多年来一直是 .NET/MSSQL 专家)。我在 .NET 中编写的第一个 Oracle 应用程序没有任何问题,我正在尝试连接到同一台服务器。
- I have installed:
- 'Java 2 Platform, Enterprise Edition 1.4 SDK'
- 'Java DB `10.5.3.0' -'Java(TM) 6 Update 21
- 'Java(TM) SE Development Kit 6 update 21
- 'Oracle IRM Client' (11g)
- Oracle 11g Release 2 JDBC Drivers(ojdbc6.jar)
- 我已经安装:
- 'Java 2 平台,企业版 1.4 SDK'
- 'Java DB '10.5.3.0' -'Java(TM) 6 更新 21
- 'Java(TM) SE 开发工具包 6 更新 21
- “Oracle IRM 客户端”(11g)
- Oracle 11g 第 2 版 JDBC 驱动程序(ojdbc6.jar)
My code is verysimple. Here it is:
我的代码很简单。这里是:
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:oci:@");
ods.setUser("username");
ods.setPassword("password");
ods.setServerName("servername");
ods.setPortNumber(1549);
ods.setServiceName("foo.myservice.com");
Connection conn = ods.getConnection();
I get below exception:
我得到以下异常:
Exception in thread "main" java.sql.SQLException: ORA-12560: TNS:protocol adapter error
线程“main”中的异常 java.sql.SQLException: ORA-12560: TNS:protocol adapter error
at oracle.jdbc.driver.T2CConnection.checkError(T2CConnection.java:737)
at oracle.jdbc.driver.T2CConnection.logon(T2CConnection.java:401)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
at oracle.jdbc.driver.T2CConnection.<init>(T2CConnection.java:148)
at oracle.jdbc.driver.T2CDriverExtension.getConnection(T2CDriverExtension.java:53)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:280)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:207)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:157)
at Select.GetScalar(Select.java:47)
at Job.Run(Job.java:20)
at Main.main(Main.java:19)
I have google'd the hack out of this.. I've tried adding a 'TNS entry to the tnsnames.ora file'. I've tried adding '##NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)' to the sqlnet.ora file. I've tried various other things but nothing is working.
我已经用谷歌搜索了这个黑客......我已经尝试在 tnsnames.ora 文件中添加一个“TNS 条目”。我已经尝试将 '##NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)' 添加到 sqlnet.ora 文件中。我尝试了其他各种事情,但没有任何效果。
Has anyone experienced this before and has any clue on how to get this to work?? Am I using the wrong version? Server is remote (I don't have Oracle server installed locally, just client). Maybe I have wrong version of Java SDK or the wrong version of the JDBC .jar file?? I just need to connect to Oracle and run a single simple query! Thanks much for any help.
有没有人以前经历过这个并且有任何关于如何让它工作的线索?我使用的是错误的版本吗?服务器是远程的(我没有在本地安装 Oracle 服务器,只有客户端)。也许我有错误版本的 Java SDK 或错误版本的 JDBC .jar 文件??我只需要连接到 Oracle 并运行一个简单的查询!非常感谢您的帮助。
采纳答案by duffymo
Try using the type IV JDBC driver instead of OCI if you can. The thin url looks like this:
如果可以,请尝试使用类型 IV JDBC 驱动程序而不是 OCI。细网址如下所示:
jdbc:oracle:thin:@host[:port]/service
I'd try code that looked more like this (fill in your defaults for the driver, URL, username, and password):
我会尝试看起来更像这样的代码(填写驱动程序、URL、用户名和密码的默认值):
package persistence;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DatabaseUtils
{
private static final String DEFAULT_DRIVER = "";
private static final String DEFAULT_URL = "";
private static final String DEFAULT_USERNAME = "";
private static final String DEFAULT_PASSWORD = "";
public static void main(String[] args)
{
String driver = ((args.length > 0) ? args[0] : DEFAULT_DRIVER);
String url = ((args.length > 1) ? args[1] : DEFAULT_URL);
String username = ((args.length > 2) ? args[2] : DEFAULT_USERNAME);
String password = ((args.length > 3) ? args[3] : DEFAULT_PASSWORD);
Connection connection = null;
try
{
connection = createConnection(driver, url, username, password);
DatabaseMetaData meta = connection.getMetaData();
System.out.println(meta.getDatabaseProductName());
System.out.println(meta.getDatabaseProductVersion());
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
close(connection);
}
}
public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException
{
Class.forName(driver);
if ((username == null) || (password == null) || (username.trim().length() == 0) || (password.trim().length() == 0))
{
return DriverManager.getConnection(url);
}
else
{
return DriverManager.getConnection(url, username, password);
}
}
public static void close(Connection connection)
{
try
{
if (connection != null)
{
connection.close();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
public static void close(Statement st)
{
try
{
if (st != null)
{
st.close();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
public static void close(ResultSet rs)
{
try
{
if (rs != null)
{
rs.close();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
public static void rollback(Connection connection)
{
try
{
if (connection != null)
{
connection.rollback();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
public static List<Map<String, Object>> map(ResultSet rs) throws SQLException
{
List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
try
{
if (rs != null)
{
ResultSetMetaData meta = rs.getMetaData();
int numColumns = meta.getColumnCount();
while (rs.next())
{
Map<String, Object> row = new HashMap<String, Object>();
for (int i = 1; i <= numColumns; ++i)
{
String name = meta.getColumnName(i);
Object value = rs.getObject(i);
row.put(name, value);
}
results.add(row);
}
}
}
finally
{
close(rs);
}
return results;
}
}
回答by gawi
If you want something simple, you should try using the THIN client instead of OCI client. Don't forget to include the right jar (ojdbc5.jar for Java 5, ojdbc6.jar for Java 6).
如果您想要一些简单的东西,您应该尝试使用 THIN 客户端而不是 OCI 客户端。不要忘记包含正确的 jar(对于 Java 5 是 ojdbc5.jar,对于 Java 6 是 ojdbc6.jar)。
回答by DCookie
Is the ServiceName you specified the service name of the Oracle instance you're trying to connect to? You're sure the port is correct?
您指定的 ServiceName 是您尝试连接的 Oracle 实例的服务名称吗?你确定端口是正确的?