2013-11-11 2 views
2

Я написал программу java для синхронизации двух таблиц в двух разных удаленных базах данных.JDBC: подключиться к Oracle DB через tnsname странная ошибка

Программа отлично работает для подключения к обеим базам данных, если в имени пользователя или пароле нет каких-либо специальных символов, иначе он будет успешно подключен к первому БД, но не будет выполнен на втором.

Предположим, что мое системное свойство «oracle.net.tns_admin» установлено правильно, и файл tnsname.ora не имеет проблем. У меня есть три базы данных с именем tns, именем пользователя, паролем:

  1. "TESTDB1", "AAA", "AAA!"
  2. "TESTDB2", "BBB", "BBB!"
  3. «TESTDB3», «CCC», «CCC» // никакой специальный символ в пароле.

    Вот мои тестовые случаи и возвращаемые значения для программы:

1> Тестовый пример 1: подключение к две базы данных 1 TO 2:

Source DB:[TESTDB1, AAA, AAA!] Connect Successfully to source DB! 
Dest DB:[TESTDB2, BBB, BBB!] Connect to dest DB failed! 

2 > Контрольный образец 2: дважды подключиться к одной и той же базе данных:

Source DB:[TESTDB1, AAA, AAA!] Connect Successfully to source DB! 
Dest DB:[TESTDB1, AAA, AAA!] Connect to dest DB failed! 

3> Тестовый пример 3: подключение к двум БД 1 до 3:

Source DB:[TESTDB1, AAA, AAA!] Connect Successfully to source DB! 
Dest DB:[TESTDB3, CCC, CCC] Connect Successfully to dest DB! 

4> Тестовый пример 4: подключение к двум базе 3 до 1:

Source DB:[TESTDB3, CCC, CCC] Connect Successfully to source DB! 
Dest DB:[TESTDB1, AAA, AAA!] Connect to dest DB failed! 

Только тестовый случай 3 успеха. Неисправное сообщение: «ORA-01017: неверное имя пользователя/пароль, отказ в регистрации». для неудачных соединений. Таким образом, часть использования - это то, почему программа не могла подключиться к БД, если в имени пользователя или пароле есть вторая персональная информация для второй базы данных? Можете ли вы попробовать мою программу ниже и проверить?

Полный код: (Вы должны иметь базу данных оракула и настроить «oracle.net.tns_admin» на свой путь tnsname.ora файла)

import java.sql.*; 
import java.util.Arrays; 
import oracle.jdbc.OracleDriver; 
public class JDBCTest { 
    public boolean success = false; 

    public JDBCTest() { 
     System.setProperty("oracle.net.tns_admin", "S:\\"); // Modify your path here 
    } 

    public static void debug(Object obj) { 
     System.out.println(obj); 
    } 
    public String processSync(String[] sourceConfig, String[] descConfig) { 
     String vReturn = "Successfully copied the data from " + sourceConfig[0] + " to " 
       + descConfig[0]; 
     String thinConn = "jdbc:oracle:thin:@" + sourceConfig[0]; 
     String username = sourceConfig[1]; 
     String password = sourceConfig[2]; 
     Connection conn1 = null; 
     Statement statement = null; 
     try { 
      DriverManager.registerDriver(new OracleDriver()); 
      debug("Source DB:"+Arrays.asList(sourceConfig)); 
      conn1 = DriverManager.getConnection(thinConn, username, 
        password); 
      conn1.setAutoCommit(false); 
      statement = conn1.createStatement(); 
      debug("Connect Successfully to source DB!"); 
     } catch (SQLException sqle) { 
      vReturn="Connect to source DB failed!"+"["+sqle.getMessage()+"]"; 
      debug("Connect to source DB failed!"); 
     } 

     thinConn = "jdbc:oracle:thin:@" + descConfig[0].trim(); 
     password = descConfig[1].trim(); 
     username = descConfig[2].trim(); 
     Statement statement2 = null; 
     Connection conn2 = null; 
     try { 
      DriverManager.registerDriver(new OracleDriver()); 
      debug("Dest DB:"+Arrays.asList(descConfig)); 
      conn2 = DriverManager.getConnection(thinConn, username, 
        password); 
      conn2.setAutoCommit(false); 
      statement2 = conn2.createStatement(); 
      debug("Connect Successfully to dest DB!"); 
     } catch (SQLException sqle) { 
      vReturn="Connect to dest DB failed!"+"["+sqle.getMessage()+"]"; 
      debug("Connect to dest DB failed!"); 
     } 

     if (conn1 != null && conn2 != null) { 
      debug("Successfully connect to both Databases"); 
     }else{ 
      return vReturn; 
     } 
     success = true; 
     return vReturn; 
    } 
    public static void main(String[] args) throws Exception { 
     JDBCTest newTest = new JDBCTest(); 
    String[] sourceConfig={"TESTDB1","AAA","AAA!"}; 
    String[] descConfig={"TESTDB2","BBB","BBB!"}; //{"TESTDB3","CCC","CCC"}; 
     newTest.processSync(sourceConfig, descConfig); 
    } 

} 
+0

использовать свое подключение thinConn и thinConn2 и попробовать – constantlearner

+0

Почему вы используете Накладка для 2-ой базы данных, почему не первый – constantlearner

ответ

1

Вы поменялись имя пользователя и пароль для conn2.

password = descConfig[1].trim(); 
    username = descConfig[2].trim(); 

должен быть

username = descConfig[1].trim(); 
    password = descConfig[2].trim(); 
+0

OMG! Как я небрежен! Большое спасибо! – Frank

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