2005/8/15

造字讓 jdbc thin driver 發生"違反協定"錯誤 in Oracle 8.0.6

症狀:使用jdbc thin driver連接Oracle 8.0.6查詢客戶姓名時,jdbc顯示 "違反協定" 錯誤,db -> AP server的網路流量飆高

發生原因:客戶姓名為特殊字,使用造字檔造字

詳細內容:使用jdbc thin driver連接Oracle 8.0.6查詢客戶姓名時顯示 "違反協定" 錯誤,但db持續透過該連線傳送無效資料(裡面都是00的封包資料)給AP,connection pool視該連線為使用中的狀態,db connection pool無法回收該connection,結果使網路流量飆高,db持續為忙碌狀態效能下降

討論:
1. 此 bug 可以單獨重新複製,故確認問題存在
2. 已測試過oracle網站上所有jdbc版本,都無法正常運作
3. jdbc連接oracle 9i,可正常運作
4. Oracle 8.0.6 短時間內無法升級,因舊有程式(C語言程式)沒有在新版的環境測試過
5. 沒有測試過oracle OCI driver,因OCI driver需要安裝oracle client,不適合AP的環境使用

舒緩劑:
1. 建立一個新的 oracle 9i db,並以dblink連接 oracle 8.0.6,透過jdbc連接9i,然後查詢客戶姓名,即可正常運作
2. 在AP上建立監控機制,監控AP是否已經把connection pool用完,並呈現撈不到資料的狀態,如果是,則發送警告簡訊給系統管理者,重新啟動AP

解藥:還沒找到,目前是無解狀態

註記:
1. 這個問題在發生初期,只有出現網路流量異常的狀況,花了很久的時間debug程式,也找不到問題在哪
2. 後來經由系統使用者回報,某些特殊的客戶,都會產生 "違反協定" 錯誤,經查證後確認問題


javax.servlet.ServletException: 違反通訊協定
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
org.apache.jsp.testdb_jsp._jspService(testdb_jsp.java:137)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)

2 則留言:

  1. 剛剛測試改用 OCI driver 就可以了,不過得在AP server上安裝Oracle Client,停機安裝是蠻麻煩的一件事...
    connection url 改為 jdbc:oracle:oci8:@tnsname

    回覆刪除
  2. 你好:
      我目前也遭遇類似問題,只是更複雜一些。我用thin將造字寫進8i沒問題,但我自己擴充了造字區,這些字無法正常顯示。經過近一個星期的測試,我發現問題在於Oracle有自己的轉碼表,如果採用Oci是否他會直接叫用系統的轉碼表呢?譬如C_950.NLS?謝謝解答。(我改過系統的表、JDK的表,包括Orcale裡的表,唯一沒改的就是Orcale自己的表,假如有的話;如果有的話,他又在哪個檔呢!)

    回覆刪除