2013-07-05 4 views
1

Я новичок в Java и пытаюсь установить соединение с базой данных Oracle с компьютера Redhat Linux. У меня соединение работает и может выполнить простой скрипт sql, но соединение работает только ок. 1 в 3 раза. Ошибка, которую он дает, и код ниже. Вполне возможно, что это проблема с нашей сетью, но я хотел бы получить немного больше знаний, прежде чем поднять вопрос о поддержке. Кто-нибудь знает, почему ошибка говорит «Имя или услуга не известна» для ssdb0255n21-oravip, когда «someserver» - это то, что указано в соединении?Подключение к Oracle из Java ненадежное

Exception in thread "main" java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection 
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:673) 
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715) 
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385) 
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30) 
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564) 
    at java.sql.DriverManager.getConnection(DriverManager.java:571) 
    at java.sql.DriverManager.getConnection(DriverManager.java:187) 
    at OracleTest.main(OracleTest.java:19) 
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection 
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:445) 
    at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:464) 
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:594) 
    at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:214) 
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263) 
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360) 
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486) 
    ... 7 more 
Caused by: java.net.UnknownHostException: ssdb0255n21-oravip: Name or service not known 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:894) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1286) 
    at java.net.InetAddress.getAllByName0(InetAddress.java:1239) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1155) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1091) 
    at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:117) 
    at oracle.net.nt.ConnOption.connect(ConnOption.java:133) 
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:411) 
    ... 13 more 

код я использую это

import java.sql.*; 
import java.util.Properties; 

public class OracleTest 
{ 
    public static void main(String[] args) throws SQLException 
    { 
    String url = "jdbc:oracle:thin:@ldaps://someserver:3131/ODBF2_BLOOD_P_S_B_001,cn=OracleContext,dc=in,dc=companyname,dc=com,dc=au"; 

    //properties for creating connection to Oracle database 
    Properties props = new Properties(); 
    props.setProperty("user", "xxx"); 
    props.setProperty("password", "xxxx"); 

    //creating connection to Oracle database using JDBC 
    System.out.println(DriverManager.getLoginTimeout()); 
    Connection conn = DriverManager.getConnection(url,props); 

    String sql ="select sysdate as current_day from dual"; 

    //creating PreparedStatement object to execute query 
    PreparedStatement preStatement = conn.prepareStatement(sql); 

    ResultSet result = preStatement.executeQuery(); 

    while(result.next()) 
    { 
     System.out.println("Current Date from Oracle : " +   result.getString("current_day")); 
    } 
    System.out.println("done"); 

    } 
} 

У меня есть ORACLE_HOME набор для /usr/lib/oracle/10.2.0.5/client64/ и создали ldap.ora и SQLNET.ORA файлы в /usr/lib/oracle/10.2.0.5/client64/network/admin. Содержание этого являются:

sqlnet.ora

NAMES.DIRECTORY_PATH = (LDAP,TNSNAMES) 

ldap.ora

DIRECTORY_SERVERS = (OID.GLB.IN.companyname.COM.AU::3131) 
DEFAULT_ADMIN_CONTEXT = "dc=in,dc=companyname,dc=com,dc=au" 
DIRECTORY_SERVER_TYPE = OID 

Похоже, что создали tnsnames.ora себе

ORA11 = 
(DESCRIPTION = 
    (ADDRESS_LIST = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) 
    ) 
(CONNECT_DATA = 
    (SERVICE_NAME = ORA11) 
) 
) 
+1

Каково содержимое вашего TNSNAMES.ORA? 'java.net.UnknownHostException: ssdb0255n21-oravip: имя или служба неизвестны' означали бы, что он неправильно настроен. Кроме того, попробуйте использовать 'tnsping ssdb0255n21-oravip' и посмотреть, можете ли вы подключиться. – kgdesouz

+0

Спасибо за ответ. Я обновил свой ответ с этими подробностями. Я удалил данные нашей компании, поэтому, если есть какие-либо несоответствия, это скорее всего опечатка от моего имени. У меня нет команды tnsping на моем ящике. – MikeKulls

+0

Ваш TNSNAMES.ORA настроен неправильно. Имя службы - «ORA11», и вы пытаетесь подключиться к ssdb0255n21-oravip. Обратите внимание: у вас, вероятно, есть tnsping в вашей папке oracle \ bin. Заметьте, у меня была аналогичная проблема в прошлом, а иногда и потому, что у вас слишком много доступных интерфейсов. Отключите один из интерфейсов. – kgdesouz

ответ

0

Ненавижу ответить на мой собственные вопросы, но оказалось, что это не проблема с Oracle. Это была проблема с ошибкой разрешения DNS. Я поместил хост ssdb0255n21-oravip в файл/etc/hosts, и проблема сразу же исчезла. Я подозреваю, что балансировка нагрузки где-то направляет 50% запросов DNS на DNS-сервер, который возвращает ошибку. У нас здесь очень сложная сеть :-)

Смежные вопросы