Не удается подключиться к базе данных Oracle из Java - ORA-12560: TNS: ошибка адаптера протокола
Это мое первое Java-приложение, которое я создаю (с использованием Eclipse IDE), и второе приложение на базе Oracle (я уже много лет являюсь парнем.NET/MSSQL). Первое приложение Oracle, которое я написал в.NET, не было проблем, и я пытаюсь подключиться к тому же серверу.
- Я установил:
- "Java 2 Platform, Enterprise Edition 1.4 SDK"
- 'Java DB `10.5.3.0' -'Java(TM) 6 Обновление 21
- 'Java (TM) SE Development Kit 6, обновление 21
- "Клиент Oracle IRM" (11 г)
- Драйверы JDBC для Oracle 11g Release 2 (ojdbc6.jar)
Мой код очень прост. Вот:
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();
Я получаю ниже исключения:
Исключение в потоке "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)
Я заполучил Google из этого... Я попытался добавить 'TNS запись в файл tnsnames.ora'. Я попытался добавить '##NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)' в файл sqlnet.ora. Я пробовал разные другие вещи, но ничего не работает.
Кто-нибудь испытывал это раньше и имеет какое-либо представление о том, как заставить это работать?? Я использую не ту версию? Сервер удаленный (у меня сервер Oracle не установлен локально, только клиент). Может быть, у меня неправильная версия Java SDK или неправильная версия файла JDBC .jar?? Мне просто нужно подключиться к Oracle и выполнить один простой запрос! Большое спасибо за любую помощь.
3 ответа
Попробуйте использовать драйвер JDBC типа IV вместо OCI, если можете. Тонкий URL выглядит так:
jdbc:oracle:thin:@host[:port]/service
Я бы попробовал код, который выглядел более похожим на это (введите свои значения по умолчанию для драйвера, 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;
}
}
Является ли ServiceName, который вы указали, именем службы экземпляра Oracle, к которому вы пытаетесь подключиться? Вы уверены, что порт правильный?
Если вы хотите что-то простое, попробуйте использовать клиент THIN вместо клиента OCI. Не забудьте включить правильный jar (ojdbc5.jar для Java 5, ojdbc6.jar для Java 6).