Tomcat 出現 JDBC Driver has been forcibly unregistered 錯誤

在deploy application的時候,偶爾會遇到 "SEVERE: A web application registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered." 這樣子的錯誤訊息。

查了一些資料後,發現在Tomcat 6.0.24之後增加了防止memory leak的feature,有幾個作法可以避免:

  • 忽略他
  • 使用6.0.23之前的版本
  • 將 JDBC Driver 的 library 放到 tomcat 下的 lib 目錄
  • 繼承 BasicDataSource,自己 close connection



【相關閱讀】
To prevent a memory leak, the JDBC Driver has been forcibly unregistered
Memory Leak Protection
MySQL create memory leak in Tomcat

Spring Bean Scope 學習

在Spring中定義一個Bean時,可以針對其scope加以設定。在新版的Spring中,共有五種不同的scope可以設定,分別為:

Spring Bean Definition

在Spring中,Bean是一個物件,藉由Spring IoC Container來初始化(instantiated)、管理組裝(assembled)。

Bean會由定義的設定檔(configuration metadata)來建立。例如,藉由在XML檔案中,<bean>的設定來建立。

設定檔(configuration metadata)需要瞭解下列事項:

  • 如何建立Bean
  • Bean的生命週期
  • Bean的相依關係(dependencies)

在一個Bean的設定檔中,透過下列的properties來進行設定:

  • class:必定存在。定義用來建立此顆bean的class
  • name:用來建立Bean的識別(identifier)
  • scope:定義Bean的Scope,包含:singleton、protopype、request、session和global-session
  • constructor-arg:用來注入dependencies
  • properties:用來注入dependencies
  • autowiring mode:用來注入dependencies
  • lazy-initialization mode:用來告知IoC Container在第一次request這個bean的時候再建立instance,而不是在startup時
  • initialization method:一個callback。在所有必要的properties被呼叫後執行
  • destructor method:一個callback。在bean被destroyed時後被呼叫

一個典型的Bean設定檔大致如下所示:

在該設定檔中,有一個HelloWorld的Bean,分別在初始和結束時,會去呼叫init和destroy方法。同時把message這個參數注入Hello World!的值。

設計良好的Web API

最近由於工作的關係,需要設計API提供給User使用,我們採用的是HTTP + RESTful + JSON Response的方式,剛好和近期讀到的一篇文章所建議的方法相同,在這邊稍微記錄一下。

這篇文章是:Designing robust web API

根據作者過去的經驗,提供幾個在設計API的Best Practice或個人經驗。分別為:

  • Use a RESTful Model:使用HTTP + RESTful + JSON作為API的開發架構
  • Stabilize your API:Expose the API as minimal as possible. 保持API的穩健,不應該有大量變動。已經釋出的功能很難被刪減。
  • Version your API:在API的Request URL中加入版本資訊方便使用者做區別。
  • Asynchronous Invocation:如果你的response需要很長的時間,採用asyn的方法。實作上有兩種模式可以參考:(1) Client在request之後,server response是一個receipt,用來向server詢問response是否已經處理完畢。(2) Client提供callback address,當server處理完response之後,會丟回callback的位置讓client接收。

【相關閱讀】

數個JSON Library效能比較

今天看到一篇比較各種不同JSON library performance的文章:Json Java parsers / generators microbenchmark

文章中比較了八種常見的JSON Library用來 parse/generate JSON的效能,分別是:

  • FlexJson (2.1) 
  • GSon (2.1) 
  • Jackson (1.9.4) 
  • JsonLib (2.4) 
  • JsonMarshaller (0.21) 
  • JsonSmart (2.0-beta2) 
  • Protostuff JSON (1.0.4) 
  • XStream (1.4.2)