2015-04-14 5 views
2

Я следую Руководству разработчика JDBC и пытаюсь проверить подключение тонкого драйвера JDBC с помощью короткой java-программы.Соединение базы данных Oracle 12c с использованием тонких драйверов вызывает ошибку ввода-вывода

import java.sql.*; 
import oracle.jdbc.*; 
import oracle.jdbc.pool.OracleDataSource; 
class JDBCVersion 
{ 
public static void main (String args[]) throws SQLException 
{ 
     OracleDataSource ods = new OracleDataSource(); 
     ods.setURL("jdbc:oracle:thin:hr/[email protected]:1522:orcl"); 
     Connection conn = ods.getConnection(); 
     // Create Oracle DatabaseMetaData object 
     DatabaseMetaData meta = conn.getMetaData(); 
     // gets driver info: 
     System.out.println("JDBC driver version is " + meta.getDriverVersion()); 
} 
} //<host>:<port>:<service> 

Я перепробовал все возможные комбинации <host>:<port>:<service>, но все-таки получить java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection

Я успешно протестировал драйвер OCI с помощью другой программы, включенной в учебнике .... но не могу получить эту работать. Мое приложение будет использовать тонкий драйвер для подключения к базе данных, поэтому мой уровень разочарования - это восхождение.

Любая помощь приветствуется.

+0

Получают ли вы такое же исключение, даже когда вы указываете имя пользователя и пароль для подключения? – SubOptimal

+0

Да, та же ошибка. НУЖНО ли имя пользователя и пароль? Я прочитал несколько противоречащих – corporateWhore

+0

Чтобы успешно подключиться, да. После переосмысления, я думаю, что исключение будет иметь другую формулировку. Вы проверили хост, порт и SID? Какой URL-адрес подключения используется для OCI? – SubOptimal

ответ

3

Возможно, следующие комментарии могут объяснить, почему вам нужно имя sevice вместо SID в URL.

  • Oracle JDBC FAQ упоминание, что SIDs will be cease to be supported in one of the next few releases of the database

  • Oracle JDBC devolopers guide упоминание Always connect to a service. Never use instance_name or SID because these do not direct to known good instances and SID is deprecated

  • Oracle 2 day + Java developer tutorial упоминают синтаксис jdbc:oracle:driver_type:[username/password]@//host_name:port_number:SID который, кажется, смесь SID и имя службы URL (после других документов и ваш рабочий пример)

  • в отличие от javado с для OracleDriver упоминания только SID синтаксиса

  • Oracle FAQ wiki упоминается как синтаксис

.

jdbc:oracle:thin:[USER/PASSWORD]@[HOST][:PORT]:SID 
jdbc:oracle:thin:[USER/PASSWORD]@//[HOST][:PORT]/SERVICE 
+0

Отлично, спасибо за информацию. Я мучительно новичок в базе данных и нахожу много противоречивых учебников. В настоящее время я работаю: Руководство разработчика JDBC 12c Выпуск 1 (12.1) – corporateWhore

0

Я могу подключиться к моему контейнеру DB (содержащий мои таблицы, пакеты и т. Д.), Используя имя пользователя/пароль.

Возвращает:

JDBC driver version is 12.1.0.2.0 

До сих пор не может подключиться к учебнику «HR» PDB, который поставляется с оракулом 12с установки и которая учебник JDBC использует.

Edit:

Понял работать, используя следующее:

import java.sql.*; 
import oracle.jdbc.*; 
import oracle.jdbc.pool.OracleDataSource; 
class JDBCVersion 
{ 
public static void main (String args[]) throws SQLException 
{  
     OracleDataSource ods = new OracleDataSource(); 
     ods.setURL("jdbc:oracle:thin:@//localhost:1522/pdborcl.global.XXXXXXXX.com"); 
     ods.setUser("hr"); 
     ods.setPassword("hr"); 
     Connection conn = ods.getConnection(); 
     // Create Oracle DatabaseMetaData object 
     DatabaseMetaData meta = conn.getMetaData(); 
     // gets driver info: 
     System.out.println("JDBC driver version is " + meta.getDriverVersion()); 
} 
} 

До сих пор не понимаю, почему мне нужно полное глобальное имя вместо имени экземпляра.

0

При подключении к PDB вы всегда должны использовать имя службы PDB в строке соединения. Похоже, что ваш сервис PDB - «pdborcl.global.XXXXXXXX.com», так что вам нужно использовать для прямого подключения PDB.

Лично я считаю, что проще использовать длинный формат URL:

«JDBC: оракул: тонкий: @ (DESCRIPTION = (ADDRESS = (ПРОТОКОЛ = TCP) (HOST = локальный) (PORT = 1522)) (CONNECT_DATA = (SERVICE_NAME = pdborcl.global.XXXXXXXX.. Ком)))»

Это делает очевидным, что вы используете имя службы вместо SID

Красота этого является то, что вы можете легко проверить строку соединения с SQLPLUS:

SQLPLUS "ч/ч @ (ОПИСАНИЕ = (АДРЕС = (ПРОТОКОЛ = TCP) (HOST = локальный) (PORT = 1522)) (CONNECT_DATA = (SERVICE_NAME = pdborcl.global.XXXXXXXX.com)))"

Если sqlplus работает, нет причин, почему драйвер JDBC Thin не будет.

Наконец, вы также можно подключить корневую базу данных с помощью пользователя привилегии, а затем выполнить команду «ALTER SESSION SET CONTAINER = pdb», чтобы переключиться на PDB. Если вы решите сделать это, вам придется изменить строку подключения, чтобы сначала подключиться к корневому контейнеру. Он должен иметь свое собственное имя службы.