在新浪雲新手指南里有部署java的示例,但是對一個新手來說難免會有一些地方犯錯,折騰了好長時間才把自己的java web部署到了新浪雲。這里主要寫一些我遇到的問題與第一次使用新浪雲的朋友分享一下。
首先需要注冊用戶拿到500雲豆,實名認證還可以再拿2000雲豆,然后注冊java web應用。注意了,每注冊一個應用都要扣100雲豆的,不要注冊着玩,俺就是一不小心兩百雲豆沒了。
你可以創建一個最簡單的測試應用,假設你的應用名字叫testSinaApp,通過web頁面上傳war包會自動創建版本1,那么你的應用地址就是http://testSinaApp.sinaapp.com或http://1.testSinaApp.sinaapp.com,新浪雲提供的web服務器是jetty,先確保你的程序在jetty下能正常運行,這樣你應該就可以訪問了。如果不行的話,查看一下jvm日志是什么原因,注意你的sdk版本一定是1.6或以下版本才行。如果不行那可能是網絡原因了,稍等一會再試一下。
jar文件需要注意一下,servletapi.jar是不需要上傳的,jetty里已經有了,跟tomcat里的不太一樣,有些方法是沒有的。如果你用log4j的話,千萬別把log4j.jar傳上去了,如果傳上去了那你怎么也找不出原因。新浪只是說為了減少程序所占空間最好不要把新浪已經有的jar往上傳,但是它沒說傳上去會有問題。這就有點扯淡了。
數據庫方面相信也會遇到很多的問題,就是連接池的管理,新浪雲說mysql的空閑時間設置的是30秒,也就是說一個連接如果30秒沒用的話就會被新浪的MySQL服務器斷開。但是我們寫的程序的連接池卻還保留着這些被服務器拋棄的連接,當過一小段時間我們再進行查詢的時候,會從連接池里取出一個連接,其實這個連接有可能已經過期了,所以會出現查詢失敗的情況。新浪已經提示了, “此外需要特別注意的就是MySQL服務在拿到連接30秒內未做操作將會自動丟失,所以在配置數據庫連接池時候特別需要注意如maxIdleTime等配置的大小”。我用的c3p0連接池,查了好多資料,對一些配置也沒怎么弄明白,網上說的亂七八糟。其實這里很簡單,直接在hibernate.cfg.xml中配置,添加下面兩行
<property name="hibernate.c3p0.automaticTestTable">c3p0_testtable</property>
<property name="hibernate.c3p0.idle_test_period">8</property>
根據你的需要再配置一下最大最小連接數量即可,根本不需要配置什么c3p0.validate,c3p0.timeout,c3p0.testConnectionOnCheckout,c3p0.testConnectionOnCheckin屬性,配了反而造成性能下降。automaticTestTable代表c3p0會自動在你的數據庫里插入一個查詢用的表,再次運行程序的時候,你就會發現你的數據庫里多了一個表,這個表就不要管了,只是c3p0定期查詢用。那多長時間查一次呢?idle_test_period就代表多長時間查詢一次(單位是秒),查詢過后會出現什么現象呢,查詢過后就相當於所有的空閑連接的空閑時間又開始從0計時,因為這相當於你實際地查詢了一次數據庫。這個時間在多長時間為好呢,當然是越大越好,但是又不能超過新浪說的30秒。為什么不設置為28秒呢,經過我的實際測試發現並不像新浪說的服務在拿到連接30秒內未做操作將會自動丟失,而是在10內就會丟失,這個大家也可以去驗證一下。所以配置成8秒比較保險,在你的實驗過程中你可以將你本地的數據庫wait_timeout改成30秒模擬一下新浪雲的服務。
我只是用了一點最簡單的,后邊接觸到其他的再作更新。
=======================================================
現在sae改動較大,本文已經過時,除了配置idle_test_period外,也可以配置maxIdleTime小於10.