JAVA WEB 系統問題整理; apache + tomcat + mysql + win server 2003

 

1   tomcat的OutOfMemoryError.


        常見的有heap 和 PermGen的內存溢出 , 但遇到" java.lang.OutOfMemoryError: unable to create new native thread "這個異常的 

        時候還是有點不知所措.
      
  後查閱得知在32位windows server 2003中, 一個進程可以使用的最大內爲2G , 而我們爲tomcat的heap+perm就分配了1.5G , 而又

        沒有限制棧的大小, 且系統使用了  ehcache, 使用jconsole觀察系統啓動時就有將近600個線程 , 其中大部分的是ehcache的(爲每 

       個表生成兩個守護線程) , 而系統線程最大值只能爲784! 我們的系統有  點特殊, 是受用獨立schema的多租戶系統,所以這種緩存對

        於我們目前來說,可以不用,所以就把ehcache關閉, 並且啓用tomcat的線程池(啓用conf/server.xml中的"Executor");

 


2 mysql+c3p0的各種異常.

 
          (1) 感觸最深的就是"Can't create a new thread (errno 12); if you are not out of available memory, you can consult the manual for

               a possible OS-dependent bug"  這個異常啦 , 修改各種配置,並實時肉眼監控mysql 連接 , 發現max_connection=1000的系統,

                  在創建了140個連接左右就宣告異常,物理內存和CPU都綽綽有餘! 網上有各種說法,  註釋"thread_concurrency" 的,修改各

                  種"size"的,都以失敗而告終.後來我把服務器上的配置替換我本地的my.ini,用loadrunner進行200用戶併發,結果拋出的異常就

                “too many   connections!” 徹底傻X! 後來老大親自出馬,在老外的回覆中隱約得知是"mysql 版本問題" ,服務器上的是遺留系

                 統 "mysql 5.0.45", 而我本地的是"5.5.1", 經測試後,決定  更換數據庫版本 , 更換後,問題解決.


           (2) "java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was

                  unexpectedly lost"   這個異常是最糾結的異常,知道數據庫連接失效了,但怎麼解決?因爲我是使用了c3p0連接池的, 並且一個

                 相同配置的連接池運行良好(在同一上application中 , 同時運行) , 用   mysql administrator監控發現, 在拋出異常的連接池管

                  理的連接中,始終有一個連接不受連接池的控制 , 所以它始終會被數據庫回收.當接下來再使用連接池獲取的時候,就悲劇了.

                  經過兩天的種種修改配置和模擬測試後,把這種異常的原因設想爲"數據庫連接的逃逸"!    首先是:人爲直接不道德的使用

                 getConnection()之類的方法 ,但使用文件檢索後,排除。   然後:hibernate session的遺漏!查看系統的數據庫訪問模

                 塊後,有種想殺人的衝動: public Session getSession()( sessionFactory.openSession()}之類的代碼! openSession
                 調用者必須顯示的關閉它,否則c3p0以爲connection一起處於忙碌狀態,就不會使用maxIdleTime和test_period進行測試!

                  悲劇的修改代碼後解決!
          (3) “java.sql.SQLException: An attempt by a client to checkout a Connection has timedout.”  
                 這個異常還在待解決中。。。。

 

  最後: 在這一段時間裏,學到了很多東西, jconsole / jvisulVM / javamelody / memoryanalyzer , 以及tomcat/mysql/c3p0的種種配

                置 , 得出個結論: (1)不要懷疑公認的東西!   (2) 敢於懷疑一切。在被這種多租戶系統各種體會弄死的同時,確實嚐到

                了很多東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章