反饋已提交
網絡繁忙
本文介紹 資料連結Oracle中一些報錯及解決方案。
設計器菜單欄「檔案>選項>進階」下預設勾選「顯示Oracle所有表」,在連結 Oracle 時容易出現效能問題,建議使用者取消勾選後再連結。
問題描述:
通常,單個資料連結對應一個 Oracle 資料庫,但是有時可能因為網路或者其他原因,資料庫連結不上或不能工作了,則整個項目就不能運作了。
解決方案:
將兩台 Oracle 資料庫中,配置相同的資料庫以及資料庫登入的帳號和密碼,然後透過配置url讓這個資料連結能連結兩台機器,即使用一個資料連結連多個資料庫。
URL格式:
jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST =IP1)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST =IP2)(PORT = 1521))(LOAD_BALANCE=yes)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = 資料庫名)))
範例1:在 192.168.100.168 和 192.168.100.170 機器上都擁有資料庫名為 orcl10g,那麼資料連結的 URL 就改成:
jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.100.168)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.100.170)(PORT = 1521))(LOAD_BALANCE=yes)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl10g)))範例2:在 env.finedevelop.com對應55602 埠擁有一個資料庫 initfantlam,同時對應 55502 埠也擁有一個資料庫 initfantlam,那麼資料庫連結的就改成:
jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST =env.finedevelop.com)(PORT = 55602))(ADDRESS = (PROTOCOL = TCP)(HOST =env.finedevelop.com)(PORT = 55502))(LOAD_BALANCE=yes)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = initfantlam)))
連結 Oracle 資料庫時,後台日誌報錯「java.lang.RuntimeException: Query:Cannot get a connection, pool error Timeout waiting for idle object」
修改連結池,擴展連結池最大連結個數,修改方法詳見 資料連結進階設定。
1)Oracle資料集預覽時,資料亂碼,日期錯亂。
2)報表預覽時,從Oracle資料庫中取出的資料亂碼。
3)透過填報向Oracle資料庫中填入的資料亂碼。
原因分析:
資料庫編碼格式與資料連結編碼格式不一致。
1)確認資料庫編碼格式
select userenv('language') from dual
2)修改資料連結編碼格式
若資料庫編碼格式為GBK,那麼資料連結編碼格式應該為GBK
若資料庫編碼格式為US7ASCII,那麼資料連結編碼格式應該為ISO-8859-1
因為US7ASCII字元集為ISO字元集的子集,這樣可以保證不會亂碼
不同資料庫版本使用的驅動是有很大差別的。
請務必參考 資料連結Oracle 選擇適合自己資料庫版本的驅動。
URL格式不正確。
調整資料連結的URL樣式,修改為:
jdbc:oracle:thin:@localhost:1521:databaseName改成jdbc:oracle:thin:@localhost:1521/databaseName
slsdb 不是正確的 sid_name,可能是 service_name
1)看看資料連結的URL中,埠後面的sid是否寫錯。
2)在 Oracle 裏面用 tnsping,檢查一下 listener 啟動了沒有,再看看 listener config file 裏面有沒有寫上SID。
3)到伺服器上看一下 listener.ora,如
SID_LIST_LISTENER= (SID_DESC= (GLOBAL_DBNAME=oracle9i) (ORACLE_HOME=/opt/oracle9i/product/9.2.0) (SID_NAME=ORCL) )
URL 裏面可能用的是上面的 GLOBAL_DBNAME 的值,就是用的 SERVICE_NAME,更換成 SID_NAME,也可以登入 sqlplus 伺服器
$sqlplus/as sysdba SQL>SELECT * FROM V$instance;查看本機上sid的名稱
連結數過多
1)查看連結數
sql>show user; 查看當前使用者
select count(*) from v$process;–當前連結數
select value from v$parameter where name = 'processes' --資料庫允許的最大連結數
2)對當前連結數進行修改,不超過最大連結數就可以:
SQL> alter system set processes = 2000 scope = spfile;
3)重啟重新整理資料庫
連結 Oracle 資料庫時,日誌報錯「ORA-12514:TNS:監聽進程不能解析在連結描述符中給出的 SERVICE_NAME」
SID_NAME 跟安裝 Oracle 時的 ORACLE_SID 相同。
SERVICE_NAME=DBNAME.DB_DOMAINDBNAME 即是資料庫名,它是 Oracle 資料庫的內部標識,安裝以後輕易不要修改。
1)重啟oracle相關「服務」,重新進行連結嘗試。
2)正確設定listener.ora檔案,新增相應的實體名,重啟資料庫伺服器,檢查各項服務是否啟動,嘗試連結。
常式啟動有問題
1)啟動oracle
net start oracleserviceorcl
2)cmd管理者運作,輸入如下程式碼
sqlplus /nolog
connect/as sysdba
ALTER USER SYSTEM IDENTIFIED BY newpass;
3)啟動常式
sql> startup
資料連結失敗,報錯:Got minus one from a read call
當連結資料庫時,是透過連結池的機制進行連結的,資料庫參數:max-session決定連結池的大小,而應用同樣也有一個參數,這個參數表示它連結資料庫連結池所佔用的最少資源。
例如:總共有 10 個應用需要連結資料庫,如果每個應用連結資料庫的最小連結數為 10 ,那麼10個應用總共會有 100 個連結,這樣就要求資料庫連結池的 max-session 必須大於100,否則就會報Got minus one from a read call的錯誤。
1)查看 processes 和 sessions 參數
show parameter processes
show parameter sessions
2)修改 processes 和 sessions 值
alter system set processes=300 scope=spfile;
alter system set sessions=335 scope=spfile;
3)重啟 Oracle
shutdown immediate;
startup;
Oracel 連結報錯:ORA-28040: No matching authentication protocol;
驅動版本不適配。
點選下載:ojdbc7.jar,把 ojdbc7.jar 放到工程的webapps\webroot\WEB-INF\lib下,刪除原來的 ojdbc14.jar 並重啟工程。
問題現象:
Oracle 資料連結成功,但資料查詢是表出不來,顯示“資料庫連結失敗!”,日誌中報錯為“嚴重:09:58:46 AWT-EventQueue-0 ERROR [standard] java.lang.RuntimeException: java.sql.SQLException: 不支援的字元集 (在類路徑中新增 orai18n.jar): ZHS16GBK”
點選下載:orai18n.jar,把 orai18n.jar 放到工程的webapps\webroot\WEB-INF\lib下,並重啟工程。
正常運作工程,忽然全部 oracle 資料庫連結不上,伺服器上 telnet ,網路是通的,不是密碼錯誤,本地用資料庫工具也能連上。重啟後能夠恢復。
問題原因:
資料連結時,使用的驅動是內建驅動,該驅動主要適配 jdk1.4 的。
如果遇到以上問題,建議升級驅動。
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉
反馈已提交
网络繁忙