2014年9月24日 星期三

使用 HttpURLConnection 時的記憶體問題

以前同事寫的 HttpClient 套件,實作是靠 Java 原生的 HttpURLConnection
不過最近又發生了使用該 HttpClient 套件時,出現 OutOfMemoryError 的訊息
發生原因是因為透過該 HttpClient 傳輸的資料太大,把 JVM 的記憶體撐爆了。

花了一些時間搜尋後,同事發現在 HttpClient 裡面加上 HttpURLConnection.setChunkedStreamingMode(0) 後問題似乎就解決了。
而關於為什麼有這個問題、以及為什麼呼叫這個方法後就可以解決,原因大概可以參考 [1] 的描述。
以下節錄 [1] 文章開頭的兩段話:
post請求的OutputStream實際上不是網絡流,而是寫入內存,在getInputStream中才真正把寫道流裡面的內容作為正文與根據之前的配置生成的http request頭合並成真正的http request,並在此時才真正向服務器發送。

HttpURLConnection.setChunkedStreamingMode函數可以改變這個模式,設置了ChunkedStreamingMode後,不再等待OutputStream關閉後生成完整的http request一次過發送,而是先發送http request頭,正文內容則是網路流的方式實時傳送到服務器。實際上是不告訴服務器http正文的長度,這種模式適用於向服務器傳送較大的或者是不容易獲取長度的數據,如文件。

參考資料:
1、Http学习之使用HttpURLConnection发送post请求深入
2、HttpUrlConnection.setChunkedStreamingMode()

2014年9月23日 星期二

實作 Java 的套件系統(Plugin System):以 jspf 框架為例

在開發比較大一點的系統時,常會有個想法是想要做到可以讓使用者動態下載套件,然後系統就能夠即時把套件套用到系統上
在 Java 上這個概念可以透過 ClassLoader 的技巧來實現。
雖然網路上也有一些文章教導如何自行建立簡單的套件系統,不過現在其實也有一些 Open Source 的專案可以利用了~。

2014年9月18日 星期四

MongoDB 監控:使用 MongoDB Management Service

MongoDB 官方有提供 MongoDB Management Service (MMS) 這個服務
可以用來監控指定的 MongoDB 資料庫,並且畫出還蠻詳細的曲線圖供使用者分析自己的資料庫運作狀況。


MMS 主要有提供監控和備援的能力,其中監控的部份是免費的、備援則是必須付費。
同時 MMS 提供了雲端版的服務和獨立安裝版,前者可以直接把統計資料送到 MongoDB 營運的 MMS 服務,後者則是自己維護一台自有的 MMS 主機。
對前者來說,使用者只需要註冊一個 MMS 的帳號,然後在能夠存取想監控的 MongoDB 的一台主機上安裝監控的代理人程式即可。
不過如果有些監控的功能想使用(例如 profiling 功能,會送出每個 MongoDB 接受的指令到 MMS 上),但又不希望這些資料被送上雲端
就可以改用後者,自己安裝自己的 MMS 囉。