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)