[99] 上到Elaster雲端的應用也可享用Derby

資管系大二下學期選修課程
授課教授:XO

版主: b80203, ghost3401, XO, maa, kelly19881227

分享到: Facebook

[99] 上到Elaster雲端的應用也可享用Derby

文章XO » 週五 4月 29, 2011 7:02 pm

輔大資管這邊今天我們實作了...

  1. 透過 Elaster RDB 服務,我們為 WTP Quick Tour 這個 Project1 專案建了一個 WEB1 資料庫,
    底下建了 LOGIN 資料表,並灌入資料。
  2. MySQL 資料庫的 JDBC 驅動程式庫 拷貝到 Project1\WebContent\WEB-INF\lib 底下
  3. 修改 Database.java 程式,把原使用 Derby 資料庫的 driver 與資料庫 URL 做了修訂,改成採用新建在 Elaster RDB 這資料庫
  4. Project1 Web 專案匯出成 Project1.war 檔案,並將之部署到 Elaster Labs 雲端
不意外地... 我們成功在雲端把這個 MVC model 動態網頁應用系統範例 跑起來。

回到辦公室後,我小試了一下!維持咱們原來透過 Derby Embedded driver 擷取 Project1db 這個 Derby 資料庫的方式,照樣可以耶!太棒了! (只不過把 Project1db 資料庫搬個家、搬到 專案資料夾 裡來)


我是這麼做的啦...

  1. C:\Project1db 這個 Derby 資料庫 整個資料夾搬到 Project1\WebContent\WEB-INF 底下來。
  2. Database.java 這個 class 裡,加入一個 static class 字串變數 dBase
  3. HelloServlet.java 這程式的 doGet() 裡,加入...
    代碼: 選擇全部
    Database.dBase = request.getServletContext().getRealPath("/WEB-INF/Project1db");

  4. 接著我把 Database.java 下面 寫死 資料庫所在位置 URL 的這一行...
    代碼: 選擇全部
    connection = DriverManager.getConnection("jdbc:derby:C:/Project1db");

    改成 ....
    代碼: 選擇全部
    connection = DriverManager.getConnection("jdbc:derby:" + dBase);

  5. 維持 derby.jar 這個 Derby Embedded JDBC 驅動程式庫依舊保留在 WEB-INF\lib 底下。
  6. Eclipse 裡透過 Tomcat 測試... 哇啦~~~ 一切如預期成功跑出來...
  7. 接下來我把這個改好且資料庫已經嵌入到 WEB-INF 資料夾裡的 Project1 專案,打包匯出成 Project1.war,部署到 Elaster 雲端,結果跑起來被吐槽...
    圖檔

待續... 要呷笨去啦! ^o^
最後由 XO 於 週四 5月 05, 2011 3:08 pm 編輯,總共編輯了 3 次。
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5307
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re:[99] 上到Elaster雲端的應用也可享用Derby

文章XO » 週五 4月 29, 2011 7:50 pm

來... 再繼續....

話說部署到 Elaster 的 WAR 是被 Jetty 這個 Servlet Container 伺候著的...
無獨有偶的... Google 的 GAE 雲端用的也是 Jetty,我猜應該都是看上他的 small footprint (苗條身材ㄇㄟ)

巧的是... 約莫四年前我分享的 Aejaks 音同 Ajax 也是騎在 Jetty 上,透過 Jacl 做腳本化的動態網頁服務...

看來英雄所見略同...

嗯!言歸正傳!這 Jetty 抱怨的是說 getServletContext() 這方法在 request 物件裡找不到...
上網做了功課... Jetty 不像 Tomcat, 他沒有在 HttpServletRequest 這個類別裡,實作這個方法,但是與 Tomcat 相同的是... 在另一個地方 i.e. ServletConfig 這個類別裡,實作了 getServletContext() 方法,所以囉 山不轉路轉...

我在 HelloServlet.java 裡 override 了 init(ServletConfig sc) 這個 method:
代碼: 選擇全部
public void init(ServletConfig sc) throws ServletException {
   super.init(sc);
   Database.dBase = sc.getServletContext().getRealPath("/WEB-INF/Project1db");      
}


再試一下!就搞定啦!
____

2011/5/5 贅述: 樓上那篇做法... 在 Eclipse 裡搭配 Tomcat 這個 Server runtime 是可以跑的。但是將這個範例打包成 .war,上傳到採用 Jetty 這個 Servlet Container 的 Elaster Labs 雲端上去跑的話,則是會失敗的。
解決之道是保留樓上那篇修訂,但是... 原來在
HelloServlet.java 這程式的 doGet() 裡,加入下面
代碼: 選擇全部
Database.dBase = request.getServletContext().getRealPath("/WEB-INF/Project1db");

的這一項要刪除掉,改由這一篇上頭所加的 init() 這一段來取代。好些同學試完樓上的修訂,緊跟著又根據這一篇所說加入這篇上面 init() 這一段。.getServletContext().getRealPath() 在 init() 與 doGet() 裡重覆做了,就會出錯啦!
____

所以類推一下 H2 資料庫、hsqldb、... 等這些用 Native Java 實作出來 JDBC 第四類 驅動程式 的資料庫皆一體適用的啦!

我推薦 H2, 瘦身的 Jetty 當然要配纖細苗條的 H2, H2 還有所謂的 In memory 資料庫... 超級厲害的說... 請參看:[97] 兩個 Java 資料庫引擎:h2 & hsqldb

手癢的話... 看圖說故事、依樣畫葫蘆囉 --> [98] 試試把 WTP Tour 改用 H2 資料庫

對了!這樣部署到 Elaster Labs 上的 WTP Quick Tour Project 我放了一個在這兒吶...
(2016/3/13 註: 趨勢科技 Elasterlabs 這項雲端試用服務已經告停。)

http://xowtptour.app.elasterlabs.com.tw/login-user.jsp
最後由 XO 於 週四 5月 05, 2011 3:31 pm 編輯,總共編輯了 10 次。
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5307
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re:[99] 上到Elaster雲端的應用也可享用Derby

文章XO » 週五 4月 29, 2011 8:18 pm

[97] Derby 資料庫 與 作業二 這一篇也值得看一看...

尤其是裡頭這一段(贅述如下)... 裡面這幾張圖:
____

話說這資料庫連結的方式有多種,看看圖吧... (剛出爐,還燒燙燙的唷...)

圖檔

圖檔

一般資料庫 (Derby 屬於這一類) 只有上述兩種連結模式。上禮拜夾檔裡所附的 h2 以及 Open Office 裡所採用的 HSQLDB 資料庫,則還有一種 In Memory 模式,顧名思義就是把資料庫直接建置在記憶體裡:

圖檔
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5307
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re:[99] 上到Elaster雲端的應用也可享用Derby

文章XO » 週六 4月 30, 2011 12:27 pm

前此試著把 WELD 這個 Jacl Templating 系統搬到 GAE 做成 Google App 時...
吃了些苦頭... 應該都跟擷取 Local file system 有關。

剛剛想把這個成功做成 Elaster CAP 雲端應用的原味 WTP Quick Tour 也就是...
  1. 採用原來 Derby Embedded Driver
  2. 只是把 C:\Project1db 資料庫建在 WTP 專案的 WEB-INF 資料夾裡


想試著做成 Google Web Application... 可是不如預期,跑起來會出現...

java.lang.NoClassDefFoundError: java.io.FileOutputStream is a restricted class.
Please see the Google App Engine developer's guide for more details.


看來又是個 Local file system access 惹的禍...

出問題點在 Database.java 程式的第 14 行...

代碼: 選擇全部
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");


才只是要載入啟始 Derby Embedded Driver 時,就出問題啦...

從這 java.io.FileOutputStream is a restricted class. 可以猜出一些端倪來...
FileOutPutStream 可是預備寫東東出去... (這可犯了 GAE 寫東西到 local file system 大忌...)
只是不知道這時候... Derby 想寫些啥?該不會是 Log 吧!? <sigh>
最後由 XO 於 週四 5月 05, 2011 3:33 pm 編輯,總共編輯了 2 次。
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5307
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.

Re:[99] 上到Elaster雲端的應用也可享用Derby

文章mtyjl » 週六 4月 30, 2011 4:24 pm

XO 寫:也試著做成 Google Web Application... 可是不如預期,跑起來會出現...

java.lang.NoClassDefFoundError: java.io.FileOutputStream is a restricted class.
Please see the Google App Engine developer's guide for more details.


看來又是個 Local file system access 惹的禍...

出問題點在 Database.java 程式的第 14 行...

代碼: 選擇全部
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");


才只是要載入啟始 Derby Embedded Driver 時,就出問題啦...

從這 java.io.FileOutputStream is a restricted class. 可以猜出一些端倪來...
FileOutPutStream 可是預備寫東東出去... (這可犯了 GAE 寫東西到 local file system 大忌...)
只是不知道這時候... Derby 想寫些啥?該不會是 Log 吧!? <sigh>


老師, GAE 有很多類別都是禁用的, 這裡有一張白名單
總之大的項目就是不能寫入檔案系統, 然後檔案系統只能讀取上傳 App 附帶的檔案,
而且我還曾經被 getServletContext().getResourcePaths() 這個操作拌了一跤, 好像是個已知的 bug....

至於 Derby, 他會在建立 schema 的時候產生很多檔案, 我想這就是為什麼不能上 GAE 的原因, 而且我到今天為止也查不到 Derby 究竟是不是 Multithread 的相關說文, 如果是 Multithread, 那這部分 GAE 當然也不淮了.....
mtyjl
漸有心得的高中生
 
文章: 136
註冊時間: 週六 9月 13, 2008 2:05 pm

Re:[99] 上到Elaster雲端的應用也可享用Derby

文章XO » 週日 5月 01, 2011 10:26 am

嗯!不知道曾幾何時...

Derby 也支援 In-Memory database 囉....

請參看:Db-derby Wiki: InMemoryBackEndPrimer

容我引述一段 怎麼做 這一部分...

How to use

To instruct Derby to use the in-memory storage factory, specify memory as the
JDBC sub-sub-protocol: jdbc:derby:memory:myDb;create=true

Note that the client driver doesn't understand the memory sub-sub-protocol, so
you have to include it in the database name:

jdbc:derby://myhost:1527/memory:myDb;create=true

The same applies when using the data sources instead of DriverManager.
eXtra Old 的是我「不是酒」哦!
제 이름은 오조휘 입니다

臉書裡依舊是 Extra.Old: http://www.facebook.com/extra.old
頭像
XO
資管系教師
 
文章: 5307
註冊時間: 週二 4月 27, 2004 12:20 pm
來自: CQ Inc.


回到 Web程式設計

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 2 位訪客

cron