[英]Cannot connect to Oracle DB from Java - ORA-12560: TNS:protocol adapter error
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). 这是我创建的第一个Java应用程序(使用Eclipse IDE)和第二个基于Oracle的应用程序(我多年来一直是.NET / MSSQL人员)。 The first Oracle app I wrote in .NET did not have any issues, and I'm trying to connect to the same server.
我在.NET中编写的第一个Oracle应用程序没有任何问题,我正在尝试连接到同一台服务器。
My code is very simple. 我的代码非常简单。 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:协议适配器错误
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'. 我已经谷歌了解了这个...我试过在tnsnames.ora文件中添加一个'TNS条目'。 I've tried adding '##NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)' to the sqlnet.ora file.
我尝试将'## NAMES.DIRECTORY_PATH =(TNSNAMES,EZCONNECT)'添加到sqlnet.ora文件中。 I've tried various other things but nothing is working.
我尝试了其他各种各样的东西,但没有任何工作。
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).
服务器是远程的(我没有在本地安装Oracle服务器,只是客户端)。 Maybe I have wrong version of Java SDK or the wrong version of the JDBC .jar file??
也许我有错误版本的Java SDK或错误版本的JDBC .jar文件? I just need to connect to Oracle and run a single simple query!
我只需要连接到Oracle并运行一个简单的查询! Thanks much for any help.
非常感谢您的帮助。
Try using the type IV JDBC driver instead of OCI if you can. 如果可以,请尝试使用类型IV JDBC驱动程序而不是OCI。 The thin url looks like this:
瘦网址看起来像这样:
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;
}
}
If you want something simple, you should try using the THIN client instead of OCI client. 如果您想要简单的东西,您应该尝试使用THIN客户端而不是OCI客户端。 Don't forget to include the right jar (ojdbc5.jar for Java 5, ojdbc6.jar for Java 6).
不要忘记包含正确的jar(适用于Java 5的ojdbc5.jar,适用于Java 6的ojdbc6.jar)。
Is the ServiceName you specified the service name of the Oracle instance you're trying to connect to? ServiceName是否指定了您尝试连接的Oracle实例的服务名称? You're sure the port is correct?
你确定端口是正确的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.