1.kettle 5.4 使用JDBC連接的時候報錯(測試不同的數據庫,發現只是連接11gRAC 的時候會報JDBC的錯誤)
具體報錯如下
java.sql.SQLException: 建數據庫連接出現異常: oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@90.12.xx.xx:1521:orcl ORCL_CON Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the client was: 90.12.xx.xx:1521:orcl
使用sqlplus 進一步測定發現數據庫功能正常,嘗試其他的連接方式。
2.嘗試用ODBC的方式連接:
管理工具-->數據源--用戶DSN--添加--選擇oracle驅動
在kettle上配置ODBC連接 測試OK!
3.嘗試OCI的連接方式報錯如下:
錯誤連接數據庫 [Source_Db] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the database Error connecting to database: (using class oracle.jdbc.driver.OracleDriver) no ocijdbc11 in java.library.path org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the database Error connecting to database: (using class oracle.jdbc.driver.OracleDriver) no ocijdbc11 in java.library.path at org.pentaho.di.core.database.Database.normalConnect(Database.java:428) at org.pentaho.di.core.database.Database.connect(Database.java:358) at org.pentaho.di.core.database.Database.connect(Database.java:311) at org.pentaho.di.core.database.Database.connect(Database.java:301) at org.pentaho.di.core.database.DatabaseFactory.getConnectionTestReport(DatabaseFactory.java:80) 主機名 : 端口 : 1521 數據庫名:orcl
4.google 了一下采取以下方案解決:
在環境變量中設置:
ORACLE_HOME=D:\app\gssjcj\product\11.2.0\dbhome_1 TNS_ADMIN=D:\app\gssjcj\product\11.2.0\dbhome_1\NETWORK\ADMIN PATH=%ORACLE_HOME%\BIN;%PATH% tnsnames.ora contains: J3_CX = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 90.xx.xx.xx)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) Copied OCIJDBC11.dll to the libswt\win64
配置OCI連接:
測試OK!
之后在http://community.pentaho.com/看到如下描述:
OCI
OCI uses the Oracle client installed on the client you're currently using. If you are using OCI and an Oracle Net8 client, the JDBC driver version used in Kettle needs to match your Oracle client version. PDI 2.5.0 shipped with version 10.1, 3.0.0 ships with version 10.2. You can either install that version of the Oracle client or change the JDBC driver in PDI if versions don't match up.
This is how you change the Oracle JDBC driver in Kettle. Replace files "ojdbc14.jar" and "orai18n.jar" in the directory libext/JDBC of your distribution with the files found in the $ORACLE_HOME/jdbc directory on your server or if the versions are different, with the JDBC driver that matches your Net8 client. For Oracle 11g the drivers are named ojdbc5.jar and ojdbc6.jar.
If you still have issues please remember that the DLL that Oracle uses to connect has to be in your path. If all else fails, try copying the ocijdbc10.dll (might be called different in different versions) to the libswt/win32 folder (or win64).
RAC (Real Application Cluster)
When dealing with a Real Application Cluster or other complex failover oracle situations, please define the connection like this:
· * Set to native (JDBC) connection type
· * Leave hostname and port empty (this is also working with a port setting of -1)
·
* Set the database name to something like this...
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host1-vip)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = host2-vip)(PORT = 1521))(LOAD_BALANCE = yes)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = db-service)(FAILOVER_MODE =(TYPE = SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5))))
or (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=PRIMARY_NODE_HOSTNAME)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=SECONDARY_NODE_HOSTNAME)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DATABASE_SERVICENAME)))
or (DESCRIPTION=(FAILOVER=ON)(ADDRESS_LIST=(LOAD_BALANCE=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxx)(PORT=1526))(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx)(PORT=1526)))(CONNECT_DATA=(SERVICE_NAME=somesid)))
Note: This does only work with a repository based system until 3.0.4. Beginning with 3.0.5 and 3.1 file based systems do also support this.