隨筆-46  評(píng)論-64  文章-2  trackbacks-0
           

          ???????? 最近準(zhǔn)備畢業(yè)設(shè)計(jì)的開題報(bào)告,原來(lái)設(shè)想手機(jī)控制端使用J2ME,但是mentor給我思路說(shuō)可以考慮使用OSGI,一番開導(dǎo),完全打亂了我原來(lái)的想法,思路當(dāng)然也開闊不少,我決定研究一下OSGI的可行性。

          ???????? 先介紹一下OSGI,如很多人一樣,對(duì)OSGI這個(gè)名詞的了解關(guān)注適于Eclipse,常見的解釋“OSGi 聯(lián)盟建立于 1999 年,是一個(gè)非贏利機(jī)構(gòu),旨在建立一個(gè)開放的服務(wù)規(guī)范。OSGi 規(guī)范為網(wǎng)絡(luò)服務(wù)定義了一個(gè)標(biāo)準(zhǔn)的、面向組件的計(jì)算環(huán)境,它最初的目的就是為各種嵌入式設(shè)備提供通用的軟件運(yùn)行平臺(tái),屏蔽設(shè)備操作系統(tǒng)與硬件區(qū)別的中間件平臺(tái),通過這個(gè)平臺(tái),可以對(duì)不同軟件商提供的應(yīng)用(OSGi 中稱為 Bundle)進(jìn)行組件的生命周期管理的能力,如應(yīng)用組件可以從運(yùn)行中被安裝、升級(jí)或者移除而不需要中斷設(shè)備的操作,應(yīng)用組件可以動(dòng)態(tài)的發(fā)現(xiàn)和使用其他庫(kù)或者應(yīng)用程序。由于 OSGi 技術(shù)具有服務(wù)組件模塊化、動(dòng)態(tài)加載應(yīng)用等優(yōu)點(diǎn),正被越來(lái)越多的領(lǐng)域關(guān)注,如嵌入設(shè)備制造業(yè)、汽車制造業(yè)、企業(yè)應(yīng)用等。目前,OSGi 聯(lián)盟發(fā)布的最新的 OSGi 服務(wù)規(guī)范為 4.0。

          ?????????? 看了OSGI的WhitePaper說(shuō)OSGI應(yīng)用于多種領(lǐng)域,見下圖osgi areas.PNG
          ??????? 我就想在我的Nokia6670手機(jī)里使用OSGI,照理來(lái)講肯定是可以搞定的,因?yàn)閃hitePaper說(shuō)了不少嘛,但是目前對(duì)OSGI的了解僅限于使用Eclipse開發(fā)幾個(gè)Bundle的簡(jiǎn)單協(xié)作,自己想想直接把這個(gè)部署到手機(jī)里貌似不太可能,然后又Google的N多資料,終于發(fā)現(xiàn)一個(gè)CLDC設(shè)備上OSGI的實(shí)現(xiàn),來(lái)自ProSystmBedded Server CLDC Edition,貌似有個(gè)評(píng)估版可以下載,我發(fā)現(xiàn)可以在我的Nokia機(jī)器上使用OSGI framework的希望了。還有Google到的信息是Knopflerfish的一個(gè)OSGI platform實(shí)現(xiàn)貌似是可以在SonyEricsson P900機(jī)器上跑起來(lái)了的。
          ??????? 郁悶的臺(tái)灣南海的地震把什么海底光纜搞掛了,這幾天國(guó)外網(wǎng)站都上不了,osgi,Knopflerfish,ProSyst都上不去,所以不能獲取進(jìn)一步深入學(xué)習(xí)資料,網(wǎng)頁(yè)都打不開非常郁悶啊!

          ????????不知道有沒有人部署過這樣的OSGI在手機(jī)里的應(yīng)用,總覺得這個(gè)OSGI的WhitePaper說(shuō)的都是抽象層面上的,我想學(xué)習(xí)的是怎么樣把這個(gè)用起來(lái)。說(shuō)OSGI規(guī)范化***,但是不知道如何用起來(lái)啊。。。希望有研究OSGI的人和我交流交流。

          ?????? osgi architecture.PNG


          ???????? J2ME + WebService是個(gè)簡(jiǎn)單的架構(gòu),J2ME開發(fā)手機(jī)上的Application,WebService提供手機(jī)和Server的信息交互。考慮過用.NET實(shí)現(xiàn)WebService,J2ME調(diào)用。這個(gè)系統(tǒng)結(jié)構(gòu)相對(duì)容易被更多人了解且容易實(shí)現(xiàn)。

          ???????? 兩種實(shí)現(xiàn),相對(duì)來(lái)說(shuō)更想嘗試OSGI,但是OSGI卻相對(duì)來(lái)說(shuō)陌生一點(diǎn),現(xiàn)在很多關(guān)于OSGI的資料也訪問不了,矛盾啊。。。

          posted @ 2006-12-29 22:47 jht 閱讀(1046) | 評(píng)論 (3)編輯 收藏

          ?????????到公司實(shí)習(xí)近五個(gè)月了,主要從事C++開發(fā),困擾于復(fù)雜的專家系統(tǒng)的陳舊代碼,不能說(shuō)代碼寫的不好,肯定比我寫出來(lái)的C++代碼好,但是卻很難讓人讀懂,邏輯復(fù)雜,而且又缺乏Code的維護(hù),文檔也沒有,所有系統(tǒng)特性完全由前人口傳聲授,搞得很頭大。。。
          ?????????
          ?????????當(dāng)然也學(xué)習(xí)到不少東西,比如如何分析復(fù)雜的代碼,經(jīng)歷種種挫敗打擊之后,我總結(jié)出如下規(guī)律,面對(duì)一個(gè)復(fù)雜的系統(tǒng),你完全不知道它是干什么的,首先從大的角度把握系統(tǒng)的業(yè)務(wù)特性,主要完成后哪些操作,企業(yè)級(jí)別應(yīng)用不外乎數(shù)據(jù)庫(kù)的CRUD,非要區(qū)分出不同之處個(gè)人認(rèn)為就是各種應(yīng)用如何把著簡(jiǎn)單的四種操作弄得更復(fù)雜啦!具體方法無(wú)非轉(zhuǎn)圈再轉(zhuǎn)圈!

          ?????????然后拆解出系統(tǒng)層次架構(gòu)的模型,在紙上畫出層次實(shí)現(xiàn)框圖有助于快速把握系統(tǒng)的層次模型。

          ?????????分解出層次模型之后的下一步就是關(guān)注BusinessLogic層?xùn)|西,如何系統(tǒng)層析模型不好,例如BL和DAO混雜,首先要做的是想辦法如何重構(gòu)這樣的模型,因?yàn)椴恢貥?gòu)這樣的系統(tǒng)很快你就會(huì)感覺這個(gè)項(xiàng)目沒有盡頭了,在痛苦中煎熬啊。在寫Code之前,一定要理解BL的東西,Code誰(shuí)都會(huì)寫,但是要高效完成Coding工作,理解你要寫什么是前提,我自己在這個(gè)方面吃虧不少,寫出來(lái)Code,自己也不知道是干什么的,項(xiàng)目結(jié)束了,現(xiàn)在強(qiáng)烈鄙視自己了

          ?????????
          ?????????重新開始BLOG生涯了,原因:鞏固自己學(xué)習(xí)到的知識(shí),并且將自己學(xué)習(xí)的體會(huì)于大家分享,也許我的些許經(jīng)驗(yàn)?zāi)芙o迷茫當(dāng)中的人帶來(lái)幫助,不吝嗇自己的只言片語(yǔ),哪怕是不夠成熟的。另一方面,表達(dá)出自己的理解和思想,或許會(huì)獲得大家不同的評(píng)價(jià),你有一個(gè)思想我有一個(gè)思想,交換,我們就有兩個(gè)思想了!當(dāng)然,自己錯(cuò)誤的理解馬上能得到大家的糾正,這對(duì)自己知識(shí)的構(gòu)建是非常好有幫助的!

          ?????????下一階段學(xué)習(xí)計(jì)劃 Spring,Hibernate,有空也玩玩AJAX

          ?????????

          posted @ 2006-12-16 20:34 jht 閱讀(273) | 評(píng)論 (0)編輯 收藏
                這篇文章在網(wǎng)上已經(jīng)被轉(zhuǎn)了無(wú)數(shù)次了,轉(zhuǎn)貼負(fù)責(zé)的有圖,不負(fù)責(zé)的圖也丟了……  
                再轉(zhuǎn)一次吧,我想也不為多,全當(dāng)成自己的學(xué)習(xí)資料收集了
               
                以下內(nèi)容轉(zhuǎn)貼,因?yàn)檗D(zhuǎn)爛了,所以作者已經(jīng)不詳了……

          最近我作了數(shù)據(jù)庫(kù)JSP的頻繁連接,在此給出數(shù)據(jù)庫(kù)連接池的必要性,對(duì)于JSP來(lái)說(shuō)一個(gè)很好的J2EE服務(wù)器是很必要的,JBOOS,WebLogic都是很好的解決方案。


          一般情況下,在使用開發(fā)基于數(shù)據(jù)庫(kù)的WEB程序時(shí),傳統(tǒng)的模式基本是按以下步驟:
            1. 在主程序(如Servlet、Beans)中建立數(shù)據(jù)庫(kù)連接。
            2. 進(jìn)行SQL操作,取出數(shù)據(jù)。
            3. 斷開數(shù)據(jù)庫(kù)連接。
            使用這種模式開發(fā),存在很多問題。首先,我們要為每一次WEB請(qǐng)求(例如察看某一篇文章的內(nèi)容)建立一次數(shù)據(jù)庫(kù)連接,對(duì)于一次或幾次操作來(lái)講,或許你覺察不到系統(tǒng)的開銷,但是,對(duì)于WEB程序來(lái)講,即使在某一較短的時(shí)間段內(nèi),其操作請(qǐng)求數(shù)也遠(yuǎn)遠(yuǎn)不是一兩次,而是數(shù)十上百次(想想全世界的網(wǎng)友都有可能在您的網(wǎng)頁(yè)上查找資料),在這種情況下,系統(tǒng)開銷是相當(dāng)大的。事實(shí)上,在一個(gè)基于數(shù)據(jù)庫(kù)的WEB系統(tǒng)中,建立數(shù)據(jù)庫(kù)連接的操作將是系統(tǒng)中代價(jià)最大的操作之一。很多時(shí)候,可能您的網(wǎng)站速度瓶頸就在于此。
            其次,使用傳統(tǒng)的模式,你必須去管理每一個(gè)連接,確保他們能被正確關(guān)閉,如果出現(xiàn)程序異常而導(dǎo)致某些連接未能關(guān)閉,將導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)中的內(nèi)存泄露,最終我們將不得不重啟數(shù)據(jù)庫(kù)。
            針對(duì)以上問題,我們首先想到可以采用一個(gè)全局的Connection對(duì)象,創(chuàng)建后就不關(guān)閉,以后程序一直使用它,這樣就不存在每次創(chuàng)建、關(guān)閉連接的問題了。但是,同一個(gè)連接使用次數(shù)過多,將會(huì)導(dǎo)致連接的不穩(wěn)定,進(jìn)而會(huì)導(dǎo)致WEB SERVER的頻頻重啟。故而,這種方法也不可取。實(shí)際上,我們可以使用連接池技術(shù)來(lái)解決上述問題。首先,介紹一下連接池技術(shù)的基本原理。顧名思義,連接池最基本的思想就是預(yù)先建立一些連接放置于內(nèi)存對(duì)象中以備使用:
              
          如圖所示,當(dāng)程序中需要建立數(shù)據(jù)庫(kù)連接時(shí),只須從內(nèi)存中取一個(gè)來(lái)用而不用新建。同樣,使用完畢后,只需放回內(nèi)存即可。而連接的建立、斷開都有連接池自身來(lái)管理。同時(shí),我們還可以通過設(shè)置連接池的參數(shù)來(lái)控制連接池中的連接數(shù)、每個(gè)連接的最大使用次數(shù)等等。通過使用連接池,將大大提高程序效率,同時(shí),我們可以通過其自身的管理機(jī)制來(lái)監(jiān)視數(shù)據(jù)庫(kù)連接的數(shù)量、使用情況等。下面我們以一個(gè)名為ConnectionPool的連接池為例來(lái)看看連接池的實(shí)現(xiàn)。先看看ConnectionPool的基本屬性:
            m_ConnectionPoolSize:連接池中連接數(shù)量下限
            m_ConnectionPoolMax:連接池中連接數(shù)量上限
            m_ConnectionUseCount:一個(gè)連接的最大使用次數(shù)
            m_ConnectionTimeout:一個(gè)連接的最長(zhǎng)空閑時(shí)間
            m_MaxConnections = -1:同一時(shí)間的最大連接數(shù)
            m_timer:定時(shí)器
            這些屬性定義了連接池與其中的每個(gè)連接的有效狀態(tài)值。連接池的自我管理,實(shí)際上就是通過定時(shí)的對(duì)每個(gè)連接的狀態(tài)、連接的數(shù)量進(jìn)行判斷而進(jìn)行相應(yīng)操作。其管理流程如下:

          通過上圖,我們可以定義出ConnectionPool要完成管理所需要的基本接口:
          public class ConnectionPool implements TimerListener{
            public boolean initialize() //連接池初始化
            public void destroy() //連接池的銷毀
            public synchronized java.sql.Connection getConnection() //取一個(gè)連接
            public synchronized void close() //關(guān)閉一個(gè)連接
            private synchronized void removeFromPool() //把一個(gè)連接從連接池中刪除
            private synchronized void fillPool() //維護(hù)連接池大小
            public synchronized void TimerEvent() //定時(shí)器事件處理函數(shù)
          }
            通過這幾個(gè)接口,已經(jīng)可以完成連接池的基本管理。在TimeEvent()函數(shù)中完成連接池的狀態(tài)檢驗(yàn)工作,fillPool()時(shí)連接池至少保持最小連接數(shù)。因?yàn)槲覀円4婷恳粋€(gè)連接的狀態(tài),所以還需要一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象:
          class ConnectionObject{
            public java.sql.Connection con; public boolean inUse; //是否被使用標(biāo)志
            public long lastAccess; //最近一次開始使用時(shí)間
            public int useCount; //被使用次數(shù)
          }
          加入了ConnectionObject對(duì)象后,在ConnectionPool中操作的應(yīng)該只是ConnectionObject,而其他進(jìn)程需要的只是ConnectionObject的con屬性,因此我們?cè)偌尤胍粋€(gè)類,作為其他進(jìn)程獲得與返回連接的接口: CLASS Conn{
            GetConnection(); //從連接池中取出一個(gè)有效連接
            CloseConnection(); //返回連接,此時(shí)并沒有關(guān)閉連接,只是放回了連接池
            DestroyPool(); //銷毀連接池
          }
            最后我們的整個(gè)系統(tǒng)總的架構(gòu)如下:
               
          通過上面的介紹,我們可以看出,連接池技術(shù)的關(guān)鍵就是其自身的管理機(jī)制,以上的管理流程只是本人一點(diǎn)見解,關(guān)鍵是想向大家介紹一種思路,在此基礎(chǔ)上,您可以進(jìn)一步完善連接池技術(shù)為您所用。


          posted @ 2006-03-14 14:36 jht 閱讀(297) | 評(píng)論 (0)編輯 收藏
          Adapter模式
          使用Adapter模式的目的:把一個(gè)類的接口轉(zhuǎn)換成客戶端需要的接口。
          適用場(chǎng)合:
             當(dāng)你想使用一個(gè)現(xiàn)有類的功能,但是它的接口不能滿足你的需要
             當(dāng)你想創(chuàng)建一個(gè)循環(huán)使用的類,用于使一些沒有相互聯(lián)系的類,或者是未知的將來(lái)會(huì)引進(jìn)的類之間協(xié)調(diào)合作完成某些功能。也就是說(shuō),這些類不必要具備一致的接口
             當(dāng)你要使用數(shù)個(gè)現(xiàn)有的的子類,但是要對(duì)每一個(gè)子類進(jìn)行接口的改寫變得很不切實(shí)際。
           
          具體的例子
             變壓器(Adapter),變壓器把一種電壓變換成另一種電壓。美國(guó)的生活用電電壓是110V,而中國(guó)的電壓是220V。如果要在中國(guó)使用美國(guó)電器,就必須有一個(gè)能把220V電壓轉(zhuǎn)換成110V電壓的變壓器。這個(gè)變壓器就是一個(gè)Adapter。
           
          客戶買回了美國(guó)的電器Machine,工作電壓110V,電器插頭為3相(陰、陽(yáng)、地級(jí)),所以需要一個(gè)電壓和相級(jí)的轉(zhuǎn)換器或者說(shuō)是適配器來(lái)使這個(gè)Machine能在中國(guó)使用。
          一、類的Adapter模式
          package Adapter;

          interface 電器需要使用
          {
              
          public void 兩相插口();
              
          public void 電壓_110V();
          }


          class 中國(guó)_供電
          {
              
          protected int v;
              
          public 中國(guó)_供電()
              
          {
                  v
          =220;
                  System.out.println(
          "中國(guó)供電提供的電壓是:" +v+"V");
              }

              
          //返回中國(guó)電壓的值
              public int voltage()
              
          {
                  
          return v;
              }

          }

          class 變壓器_相位轉(zhuǎn)換器 extends 中國(guó)_供電 implements 電器需要使用 
          {

              
          public void 兩相插口() {
                  System.out.println(
          "變壓器_相位轉(zhuǎn)換器——提供三相到兩相轉(zhuǎn)換操作,返回兩相插口");
                  
              }


              
          public void 電壓_110V() {
                  v 
          = this.voltage()/2;
                  System.out.println(
          "變壓器_相位轉(zhuǎn)換器——轉(zhuǎn)換后提供電壓為:"+v+"V");
              }

              
          }


          public class ClassAdapter {

              
          public static void main(String[] args) {
                  變壓器_相位轉(zhuǎn)換器 device 
          = new 變壓器_相位轉(zhuǎn)換器();
                  
                  device.電壓_110V();
                  device.兩相插口();
                  
                  System.out.println(
          "經(jīng)過變壓器_相位轉(zhuǎn)換器的包裝(Warpper),在美國(guó)買來(lái)的電器能夠使用啦!^0^");

              }


          }


          二、對(duì)象的Adapter模式
          package Adapter;

          interface 電器需要使用_a
          {
              
          public void 兩相插口();
              
          public void 電壓_110V();
          }


          class 中國(guó)_供電_a
          {
              
          protected int v;
              
          public 中國(guó)_供電_a()
              
          {
                  v
          =220;
                  System.out.println(
          "中國(guó)供電提供的電壓是:" +v+"V");
              }

              
          //返回中國(guó)電壓的值
              public int voltage()
              
          {
                  
          return v;
              }

          }

          class 變壓器_相位轉(zhuǎn)換器_a implements 電器需要使用_a 
          {
              中國(guó)_供電_a supply 
          = new 中國(guó)_供電_a();

              
          public void 兩相插口() {
                  System.out.println(
          "變壓器_相位轉(zhuǎn)換器——提供三相到兩相轉(zhuǎn)換操作,返回兩相插口");
                  
              }


              
          public void 電壓_110V() {
                  supply.v 
          = supply.voltage()/2;
                  System.out.println(
          "變壓器_相位轉(zhuǎn)換器——轉(zhuǎn)換后提供電壓為:"+supply.v+"V");
              }

              
          }


          public class ObjectAdapter {

              
              
          public static void main(String[] args) {
                  變壓器_相位轉(zhuǎn)換器_a device 
          = new 變壓器_相位轉(zhuǎn)換器_a();
                  
                  device.電壓_110V();
                  device.兩相插口();
                  
                  System.out.println(
          "經(jīng)過變壓器_相位轉(zhuǎn)換器的包裝(Warpper),在美國(guó)買來(lái)的電器能夠使用啦!^0^");

              }


          }


          posted @ 2006-02-24 21:13 jht 閱讀(1010) | 評(píng)論 (0)編輯 收藏

          設(shè)計(jì)模式學(xué)習(xí)(一) 工廠模式之簡(jiǎn)單工廠

          Creational Pattern:

          *creates objects for you rather than having you instantiate objects directly

          *gives your program more flexibility in deciding which objects need to be created for a given case

           

          工廠模式有以下三種形態(tài):

          簡(jiǎn)單工廠(Simple Factory)模式:又稱靜態(tài)工廠方法(Static Factory Method)模式

          工廠方法(Factory Method)模式:又稱多態(tài)性工廠(Polymorphic Factory)模式

          抽象工廠(Abstract Factory)模式:又稱工具箱(Kit Toolkit)模式

           

          簡(jiǎn)單工廠模式其實(shí)是普通工廠模式的一個(gè)特例,今天就從這里開始吧。

          其結(jié)構(gòu)可以簡(jiǎn)單地表示如下:


          SimpleFactory.jpg沒用
          Visio畫,大家見諒呀


              我們從一個(gè)實(shí)際的例子來(lái)看這個(gè)簡(jiǎn)單工廠模式

          假設(shè)一個(gè)農(nóng)場(chǎng),專門向市場(chǎng)銷售各種水果,假設(shè)只提供良種的水果,蘋果和葡萄,我們?yōu)樗O(shè)計(jì)一個(gè)抽象類Fruit,所有水果都必須實(shí)現(xiàn)這個(gè)接口

          package simple_Factory;
          //水果抽象出來(lái)的接口
          public interface Fruit {
              
          void grow();
              
          void harvest();
          }


          public class Apple implements Fruit {

              
          private int treeAge;

              
          public void grow() {
                  log(
          "Apple is glowing");
                  
              }


              
          private void log(String string) {
                  System.out.println(string);        
              }


              
          public void harvest() {
                  log(
          "Apple has been harvested.");
              }

              
              
          public int getTreeAge() {
                  
          return treeAge;
              }


              
          public void setTreeAge(int treeAge) {
                  
          this.treeAge = treeAge;
              }


          }


          public class Grape implements Fruit {

              
          private boolean seedless;
              
          public void grow() {
                  log(
          "Grape is growing------");
              }


              
              
          public void harvest() {
                  log(
          "Grape has been harvested.");
              }

              
          private void log(String string) {
                  System.out.println(string);        
              }


              
          public boolean isSeedless() {
                  
          return seedless;
              }


              
          public void setSeedless(boolean seedless) {
                  
          this.seedless = seedless;
              }


          }


          public class OtherFruits implements Fruit {

              
          public void grow() {        
              }


              
          public void harvest() {        
              }


          }

           

          FruitFactory類,水果加工廠,根據(jù)需要(不同參數(shù)代表不同的水果需求)給市場(chǎng)供給水果。

           

          package simple_Factory;

          //水果加工廠,根據(jù)需要給市場(chǎng)供給水果
          public class FruitFactory {
              
          public static Fruit supplyFruit(String need)
              
          {
                  
          if(need.equalsIgnoreCase("apple"))
                      
          return new Apple();
                  
          else if(need.equalsIgnoreCase("grape"))
                      
          return new Grape();
                  
          else
                      
          return new OtherFruits();        
              }

          }

          測(cè)試方法:
          package simple_Factory;

          public class Test {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args) {
                  Fruit a 
          = FruitFactory.supplyFruit("apple");
                  Fruit b 
          = FruitFactory.supplyFruit("Grape");
                  Fruit c 
          = FruitFactory.supplyFruit("others");
                  
                  a.grow();a.harvest();
                  b.grow();b.harvest();
                  c.grow();c.harvest();
              }

          }


              自己弄懂和講給別人懂還是有很大差距的,第一篇文章雖然寫好了,但是感覺不夠好,不知道能不能給初學(xué)者一點(diǎn)點(diǎn)幫助呢……

              自強(qiáng)不息,繼續(xù)努力!
          posted @ 2006-02-21 22:03 jht 閱讀(2189) | 評(píng)論 (7)編輯 收藏
          僅列出標(biāo)題
          共5頁(yè): 上一頁(yè) 1 2 3 4 5 
          主站蜘蛛池模板: 托克托县| 博湖县| 昆山市| 祁阳县| 航空| 南京市| 仙游县| 红桥区| 区。| 勐海县| 河间市| 吕梁市| 文山县| 靖宇县| 得荣县| 平山县| 苍梧县| 珲春市| 右玉县| 德安县| 咸丰县| 绥德县| 镶黄旗| 竹山县| 张家界市| 西贡区| 七台河市| 桂阳县| 西峡县| 利川市| 云梦县| 鲁山县| 丹阳市| 磴口县| 鸡东县| 顺平县| 昂仁县| 梅州市| 万安县| 昌都县| 龙江县|