• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            xiaoguozi's Blog
            Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習慣原本生活的人不容易改變,就算現狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預料,人們需要更細心的觀察別人,要隨時注意才能保護別人,因為他們未必知道自己要什么·····
            一.
            Action Script 3.0(簡稱AS)開發Browser Player時,需要用NetStream,但現在NetStream.play只支持HttpFile兩種協議。上網檢查youtubetudouyouku,發現他們用的播放協議也都是Http。而以Flash Media Server(簡稱FMS)或Red5作為流媒體服務器時,它們提供的是RTMP協議,且這兩種流媒體服務器是專門做過優化的。這兩種協議,HTTPRTMP,有幾點不同:

            1)用HTTP方式: 先通過IIS FLV下載到本地緩存,然后再通過NetConnection的本地連接來播放這個FLV,這種方法是播放本地的視頻,并不是播放服務器的視頻。因此在本地緩存里可以找到這個FLV。其優點就是服務器下載完這個FLV,服務器就沒有消耗了,節省服務器消耗。其缺點就是FLV會緩存在客戶端,對FLV的保密性不好。

            2)用RTMP方式: 通過NetConnection連接到FMS/Red5服務器,并實時播放服務器的FLV文件,這種方式可以任意選擇視頻播放點,并不象HTTP方式需要緩存完整個FLV文件到本地才可以任意選擇播放點,其優點就是在本地緩存里是找不到這個FLV文件的。其優點就是FLV不會緩存在客戶端,FLV的保密性好,其缺點就是消耗服務器資源,連接始終是實時的。

            由以上分析可以知道,Http方式是本地播放,而RTMP方式是服務器實時播放。


            二.

            1.什么是流媒體
            目前在網絡上播放多媒體信息主要有兩種方式,一種是非實時方式,即將多媒體文件下載到本地磁盤之后,再播放該文件;另一種方式是實時方式,直接從網上將多媒體信息逐步下載到本地緩存中,在下載的同時播放已經下載的部分,這就是所謂的流媒體技術--。
            采用流媒體技術的目的是提高多媒體在網上實時播放的質量和流暢程度。多媒體數據量非常大,如果在網上采用傳統的文件下載方式,由于受網絡帶寬的限制,即使經過壓縮處理,也要占用用戶的大量的磁盤空間,讓用戶花費大量的等待時間。而采用實時播放方式,由媒體服務器根據用戶請求,向用戶計算機連續、實時地傳送多媒體信息,用戶不必等到整個文件全部下載完畢,即可進行播放,在播放的同時,文件的剩余部分將在后臺從服務器內繼續流向用戶計算機,這樣既節省了用戶的磁盤空間,又避免用戶不必要的等待。尤其重要的是,利用流媒體技術,還可像廣播電視直播一樣,實現網上現場直播功能。流媒體服務又稱媒體服務,根據媒體內容形式可分為音頻服務和視頻服務。
            2.流式傳輸方式
            流式傳輸是流媒體實現的關鍵技術,根據實現原理可分為順序流式傳輸(Progressive streaming)和實時流式傳輸(Realtime streaming)兩種方式。在具體應用中,選用哪種傳輸方式取決于實際需求。
            順序流式傳輸
            與HTTP服務一樣,順序流式傳輸是順序下載,在下載文件的同時用戶可在線播放媒體,由于不支持隨機訪問,用戶只能按流入的順序播放已下載的內容,而不能跳到還未下載的內容。這是一種介于下載文件和實時流式傳輸之間的形式,又稱為漸進式下載。與流媒體相同的是,在開始播放漸進式下載的文件之前無需將整個文件存儲在計算機上;與流媒體不同的是,在完成播放內容之后,整個漸進式下載的文件會保存在計算機上。HTTP協議本身就支持這種方式 ,因而可將流媒體文件通過Web服務器發布,即可實現順序發送,不需要其他特殊協議支持。當用戶的Web瀏覽器通過HTTP協議向Web服務器請求流媒體文件時,Web服務器通過HTTP協議將流媒體文件發送到用戶端,用戶端的Web瀏覽器根據流媒體文件類型,啟動相應的流媒體播放程序進行播放,與此同時,文件的剩余部分將從服務器端繼續流向用戶計算機。這種方式的優點有:1支持無損下載,能夠保證播放的最終質量;2由標準的HTTP協議支持,兼容性好,不受防火墻的影響。其不足之處有:1不支持隨機訪問;
            2對于慢速連接來說,相應的延遲也比較嚴重3不支持現場直播。因此,順序流式傳輸適于
            播放短小的、要求播放質量高的流媒體文件,如廣告、精彩片斷和歌曲。這種方式是一種最
            簡單的點播,但不是本章要介紹的內容。
            實時流式傳輸
            實時流式傳輸則是一種邊下載邊播放的方式,與順序流式傳輸方式不同的是,它可根據用戶連接的帶寬和速度進行動態調整,以保證媒體信號帶寬與網絡連接帶寬相匹配,使用戶能做到真正的實時播放。這種方式需要特殊的傳輸協議支持,服務器端需要使用專用的流媒體服務器。當用戶使用流媒體播放器通過實時傳輸協議向流媒體服務器請求流媒體服務時,流媒體服務器通過實時傳輸協議將流媒體文件發送到用戶端,流媒體播放器進行播放,與此同時,文件的剩余部分將從服務器端繼續流向用戶計算機。在具體的實現方案中,一般結合Web服務器來提供流媒體服務,使用HTTP/TCP協議來傳輸控制媒體播放的信息,利用實時傳輸協議來傳輸要播放的多媒體信息。這種方式的優點有:①支持真正的實時傳輸;②支持現場直播;③支持隨機訪問。其不足之處有:①有損下載,使用慢速連接時的播放質量較差;②穿過防火墻時有時會出現問題;③需要專門的服務器和協議支持。因此,實時流式傳輸特別適合實時播放的需要,如現場直播,也用于大型多媒體文件的播放,最典型的就是視頻點播、視頻廣播。實時流式傳輸也正是本章主要介紹的流媒體服務。


            3.流媒體播放方式
            從不同的角度來看,流媒體播放方式的含義不同。
            點播和廣播(直播)
            從用戶參與的角度來看,可分為點播和廣播兩種方式。點播指用戶主動與服務器進行連接,發出選擇節目內容的請求,服務器應用戶請求將節目內容傳輸給用戶。在播放過程中,用戶可以對播放的流進行開始、停止、后恕⒖旖 蛟萃2僮鰲5悴ヌ峁┝碩粵韉淖畬罌刂疲 庵址絞接捎諉扛隹突Ф爍髯粵 臃 衿鰨 虼嘶嵯 拇罅康耐 绱 懟?
            廣播指的是媒體服務器主動發送流數據,用戶被動接收流數據的方式。在廣播過程中,客戶端只能接收流,但不能控制流,例如,用戶不能進行暫停、快進或后退操作。這種方式類似于電臺廣播或電視直播,用戶可選擇頻道接收所需的廣播節目,但是在收聽收看節目時,不能隨意控制節目的播放流程,在有些流媒體產品中將此稱為直播。
            單播和多播(組播)
            從服務器端傳輸數據的方式來看,可以分為單播、多播和廣播3種發布方式。IP協議支持單播、廣播和多播(組播)3種地址類型。由于流媒體服務是在IP網絡中實現的,因此流媒體在網上傳輸也有相應的3種方式。
            單播指在客戶端與媒體服務器之間需要建立一個單獨的數據通道,即從一臺服務器發送的每個數據包只能傳送給一個客戶機。單播是一種典型的點對點傳輸方式。每個用戶必須分別對媒體服務器發送單獨的請求,而媒體服務器必須向每個用戶發送所請求的數據包拷貝,每份數據拷貝都要經過網絡傳輸,占用帶寬和資源,如果請求的用戶多起來,網絡和服務器將不堪重負。
            多播又稱組播,是一對多連接,多個客戶端可以從服務器接收相同的流數據,即所有發出請求的客戶端共共享同一流數據,從而節省帶寬資源。多播將一個數據流發送給多個客戶端,而不是分別發送給每個客戶端,客戶端直接連接到多播流,而不是服務器。采用這種方式,一臺服務器甚至能夠對數萬臺客戶機同時發送連續的數據流,而無延時的現象發生。
            還有一種傳輸方式稱為廣播,將數據包的單獨一個拷貝發送給網絡上的所有用戶。不管用戶是否需要,都進行廣播傳輸,浪費了網絡資源。為阻止廣播風暴,一般將廣播限制在一個子網中,流媒體傳輸中并不采用這種方式。這里的廣播是指傳輸方式,而前面講述的廣播(直播)則指用戶被動接收的播放方式。
            在實際應用中,播放方式一般將上述方式結合起來,如點播單播、廣播單播和廣播多播。
            分流(轉發)
            有些情況下,對同一流內容可使用分流(也稱分發、轉發或轉播)方法,在流媒體服務器之間,而不是在流服務器與客戶端之間傳輸流數據。提供流內容的服務器稱為發送服務器(或稱源服務器),它將流發送給其他接收服務器(或稱分發服務器、分流服務器)接收,再由接收服務器將流轉發到客戶端。分流方法可解決流媒體服務器超負荷的問題,使得客戶端可以就近訪問流媒體服務器,獲得更好的訪問質量,并且能節省帶寬,支持更多的用戶連接。分流技術可以采用UDP單播、UDP組播和TCP等3種方式進行通信。
            4.流媒體類型
            根據媒體形式,流媒體可分為音頻和視頻,相應的服務稱為音頻服務和視頻服務。
            流媒體指在網絡上進行流式傳輸的連續時基媒體。根據信息來源,時基媒體信息可分為實況流媒體和流媒體文件。實況流媒體指通過視頻或音頻錄制設備獲取的實時多媒體信息,可用于現場直播。流媒體文件是經過特殊編碼,使其適合在網絡上邊下載邊播放的特殊多媒體文件,常見的文件格式有ASF、WMV、WMA、RM、RA、SWF等。可以對音頻文件、視頻文件、圖像文件以及其他多媒體文件進行編碼,將其轉換成流媒體格式。強調一下,像其他多媒體文件一樣,流媒體文件也可完全下載到硬盤之后,再進行播放。

            三.
            21世紀,互聯網正以驚人的速度向人們日常生活的各個方面延伸,現在,坐在電腦前,你就可以收看網絡上的影視節目了。

              也許你會說:“你真笨,那么大一個電視不看,你偏要看17寸的電腦。”其實,網絡影視有其得天獨厚的優勢。首先,它不受時間、地點的限制,你可以在任何時間或地點觀看自己喜歡的影視節目;其次,你可訂制個性化的服務,點播自己喜歡的節目,查閱節目的相關信息。當然,在網上收看影視節目要具備一定的條件,除了高速的網絡帶寬外,你還要掌握流媒體的播放技術。目前,寬帶正在向家庭普及,你所要具備的,就是了解流媒體的相關技術,我們這篇文章將引導你掌握流媒體的基本知識,在這里沒有高深的技術,我們將以通俗的語言,向你講述流媒體的傳輸原理,使你通過這篇文章對流媒體的格式及相應的播放器能有一個大致的認識。

              什么叫流媒體呢?流媒體(Streaming Media)是指采用流式傳輸技術在網絡上播放的媒體文件。從這個定義可以看出,流媒體和普通媒體的區別就是:第一,從服務器到客戶端,采用的是流式傳輸技術,使用這種技術,客戶端計算機不用將整個的影音文件下載到本地,便可以即時收看或收聽。第二,就是他的媒體文件格式,為了達到網絡上流式傳播文件的目的,流媒體大都具有很高的壓縮比,這種壓縮可能會使影音文件的品質有所下降,但基本還能夠被人們所接受。

              一、流式傳輸及傳輸協議

             

              在網絡上,我們查看影音文件有兩種方法,第一種方法就是我們經常使用的下載方法,這種方法就是把整個影音文件下載到本地硬盤然后進行播放,由于這類文件一般都比較大,所以下載的時間比較長。另外一種方法就是使用流式傳輸,這種方法不需要把整個影音文件下載到本地硬盤,在觀看節目時,我們只需要下載一部分緩沖,余下的部分可以一邊觀看一邊下載,顯然,這種方法對網絡的帶寬有一定的要求,網速越高,播放就越流暢。

              流式傳輸是流媒體播放的關鍵技術,它不需要我們下載龐大的媒體文件就可觀看視頻節目,雖然在播放前要進行緩沖,但這種緩沖也只有幾秒或十幾秒。實現流式傳輸有兩種方法:實時流式傳輸和順序流式傳輸。一般來說,如果視頻為實時廣播,或使用流式傳輸媒體服務器,使用如RTSP的實時協議,這種傳輸方式即為實時流式傳輸。如果使用Web服務器,使用HTTP協議,那么文件即通過順序流發送。

              1.順序流式傳輸(Progressive streaming)

              順序流式傳輸是順序下載,在下載文件的同時用戶可觀看在線媒體。由于標準的HTTP服務器在不需要其他特殊協議的情況下即可發送這種形式的文件,所以它又被稱作HTTP流式傳輸。順序流式傳輸在高帶寬(帶寬大于流文件的比特率)的情況下,可以實現邊下載邊播放,網絡丟包會重新傳輸直至用戶收到,所以能夠保證視頻播放的最終質量,因此,它一般被來用傳輸高質量的短片段,如片頭、片尾和廣告。順序流式傳輸不能廣播實況流,不能跳過頭部,必須先下完前面的才可以看后面的,必須經歷延遲,這種情況,在低帶寬的網絡連接下尤其如此。

              順序流式文件是放在標準HTTP 或 FTP服務器上,易于管理,基本上與防火墻無關。順序流式傳輸不適合長片段和有隨機訪問要求的視頻,如講座、演說或演示。

              2.實時流式傳輸(Realtime streaming)

              實時流與HTTP流式傳輸不同,實時流式傳輸總是實時傳送,可以實現實況轉播,支持隨機訪問,用戶可快進或后退以觀看前面或后面的內容。

              實時流式傳輸必須配匹連接帶寬,也就是說,如果文件比特率超過連接速度,觀看將會斷續,而且,由于出錯丟失的信息會被服務器忽略,當網絡擁擠或出現問題時,視頻質量會下降,所以,要想保證視頻質量,選擇順序流式傳輸也許會更好。實時流式傳輸需要特定的服務器,如QuickTime Streaming Server、RealSystem IQ與Windows Media Server。這些服務器允許你對媒體發送進行更多級別的控制,因而系統設置、管理比標準HTTP服務器更復雜。實時流式傳輸使用與之適應的網絡傳輸協議,如:RTSP (Realtime Streaming Protocol)或MMS (Microsoft Media Server),這些協議在有防火墻時有時會出現問題,導致用戶不能看到一些地點的實時內容。

              二、流媒體格式與播放器

             

              目前,在流媒體技術方面,Real Networks、Microsoft(微軟)、Apple(蘋果)三分天下,它們都有自己的流媒體格式和相應的播放器,已形成鼎足之勢,因此,你要觀看豐富多彩的網絡影視節目,全面安裝他們的播放器是最好的辦法(有些第三方的播放器,比如超級解霸、金山影霸、東方影都以及Media Player Classic的系列軟件等,都帶有Real和QuickTime的核心解碼文件,這此播放器雖然能夠播放本地的Real Media文件,但Opera等非IE核心的瀏覽器在調用非官方的Real和QuickTime插件播放內嵌流媒體時常不能正確調用正確的解碼器而導致播放不正常,所以使用非IE核心瀏覽器為主的朋友不要安裝這些軟件或它們自帶的Real和QuickTime的解碼器)。

              1.Real Networks的流媒體格式及播放器

              Real Networks的流媒格式主要有RM(Real Media)、RMVB(Real Media VBR)等,此類格式一般都有很高的壓縮比和比較好的網絡傳輸能力,雖然畫質差點,但文件體積小,特別適合在低速網絡上在線播放音視頻節目。Real Networks的流媒體文件可以用RealOne和RealPlaye r進行播放,最新推出的RealPlayer 10比RealOne資源占用少,啟動速度也比RealOne有了較大幅度的提高,支持更多的媒體格式,建議朋友們到Real Networks的主頁(http://www.real.com/)上去下載安裝它的簡體中文版(如圖1)。

            posted @ 2009-07-20 16:55 小果子 閱讀(577) | 評論 (0)編輯 收藏

            Hibernate文檔筆記共分為三個部分,此處是第三部分,重點講述了可選配置項,它包括Hibernate配置項、Hibernate JDBC和連接的屬性、Hibernate Cache 屬性、Hibernate事務屬性和Miscellaneous properties 各種混合的屬性。

            九、可選配置項

            下面介紹的Hibernate屬性,有一些是系統級別的。系統級別的屬性只能通過-Dproperty=value來設置或在hibernate.properties文件中設置,不能使用上面的方式設置。

            1.Hibernate配置項

            (1)hibernate.dialect指定方言后,Hibernate可以根據低層數據庫自動產生優化過的SQL。取值為org.hibenate.dialect.Dialect的繼承類。多數情況下,Hibernate可以根據低層JDBC返回的metadata來判斷。

            (2)hibernate.show_sql打印所有的SQL語句到控制臺,可以通過設置org.hibernate.SQL類的日志策略到DEBUG級,實現同樣的效果。取值true|false。

            (3)hibernate.format_sql 格式化SQL語句在打印到控制臺或寫入日志文件時。取值true|false。

            (4)hibernate.default_schema 在產生SQL語句時,在表名前加上映射文件給出的表空間(tablespace)或數據庫模式(schema)。取值SCHEMA_NAME。

            (5)hibernate.default_catalog 在產生SQL語句時,在表名前加上映射文件給出的catalog。取值CATALOG_NAME。

            (6)hibernate.session_factory_name  Hibernate創建org.hibernate.SessionFactory實例后后會自動的將這個綁定到JNDI中的名字上。取值jndi/sf。

            (7)hibernate.max_fetch_depth 設置對單個表的外連接數最大深度。0是屏蔽默認的外連接設置。推薦設置為0到3之間。

            (8)hibernate.default_batch_fetch_size 設置Hibernate批量聯合查詢的尺度。強烈建議。推薦設置為4、8、16。

            (9)hibernate.default_entity_mode 默認的實體表現模式,通過SessionFactory打開的所有的Session。取值,dynamic-map、dom4j、pojo。

            (10)hibernate.order_updates 強迫Hibernate通過被更新項的主鍵值排序SQL更新。這樣可以在高并發時,減少事務死鎖。取值true|false。

            (11)hibernate.generate_statistics 如果設置為true,Hibernate將為性能調整,收集統計信息。取值true|false。

            (12)hibernate.use_identifier_rollback 如果設置為true,產生的標識屬性將被重置成默認值,當對象被刪除后。取值為true|false。

            (13)hibernate.use_sql_comments  如果設置為true,Hiberante將為SQL產生注釋,這樣更利于調試。默認值為false。取值為true|false。

            2.Hibernate JDBC和連接的屬性

            (1)hibernate.jdbc.fetch_size 指定JDBC的查詢尺度。通過調用(Statement.setFetchSize())。

            (2)hibernate.jdbc.batch_size 指定Hibernate如何使用JDBC2批量更新。取值,推薦5到30。

            (3)hibernate.jdbc.batch_versioned_data 設置這個屬性為true,JDBC將返回executeBatch執行后正確的行數。打開這個參數,通常是安全的。Hibernate將自動的譯碼這些數據使用批量DML。默認為false。取值true|false。

            (4)hibernate.jdbc.factory_class 選擇一個定制的org.hibernate.jdbc.Batcher。所有的應用程序不需要配置這個屬性。取值,定義工廠的類名。

            (5)hibernate.jdbc.use_scrollable_resultset  Hibernate使用JDBC2的可滾動記錄集。當使用用戶提供的JDBC連接時,需要設置這個參數。否則,Hibernate使用連接MetaData。取值true|false。

            (6)hibernate.jdbc.use_streams_for_binary 當讀或寫二進制數據或序列化數據從JDBC或到JDBC,使用流。系統級的數據。設置true|false。

            (7)hibernate.jdbc.use_get_generated_keys 在插入后,可以使用JDBC3的PreparedStatement.getGeneratedKeys()中的值找回本地產生的鍵值。要求JDBC3+和JRE1.4+,如果使用Hibernate identifier generator后你的驅動程序有問題,請設置為false。默認情況下,設法連接MetaData來決定。取值,true|false。

            (8)hibernate.connection.provider_class 實現了org.hibernate.connection.ConnectionProvider 接口的類的名稱,為Hibernate提供連接。

            (9)hibernate.connection.isolation 設置JDBC事務隔離的級別。檢查java.sql.Connection的定義的常量值,但要注意大多數數據庫不支持所有的隔離級別、一些附加的和非標準的隔離級別。取值,1、2、4、8。

            (10)hibernate.connection.autocommit  JDBC共享連接的自動提交。(不推薦)取值,true|false。

            (11)hibernate.connection.release_mode 指定什么時候,Hibernate應該釋放JDBC連接。默認情況下,JDBC是一直存在,只到Session是被明確關閉或斷開連接時。對于應用的服務器JTA數據源,你應該使用after_statement強制釋放JDBC連接在每個JDBC請求結束后。對于非JTA數據源,通常是在每個事務結束后釋放JDBC連接是有意義的。將該值設為auto時,JTA和CMT事務策略時,是選擇after_statement方式。JDBC事務策略時,是選擇after_transaction。取值,auto(default),on_close,after_statment,after_transaction。

            注意:這個設置只影響通過SessionFactory.openSession打開的session。對于通過SessionFactory.getCurrentSession獲取的session,CurrentSessionContext實現類的配置是用來控制這些session的連接釋放模式。

            (12)hibernate.connection. 傳遞這些屬性到DriverManager.getConnection中。

            (13)hibernate.jndi. 傳遞這些屬性到JNDI InitialContextFactory。

            3.Hibernate Cache 屬性

            (1)hibernate.cache.provider_class 定制的CacheProvider的類名。

            (2)hibernate.cache.use_minimal_puts 花費更多的讀操作,來優化二級緩存的最少寫操作。這個操作對于集群緩存是非常有用的。在Hibernate3中,對于集群緩存是默認開啟該功能的。取值,true|false。

            (3)hibernate.cache.use_query_cache 開啟查詢緩存,個別查詢肯定應該開啟查詢緩存。取值,true|false。

            (4)hibernate.cache.use_second_level_cache 也許過去習慣于完全屏蔽掉二級緩存,默認是開啟,對于指定CacheProvider實現類的情況。取值,true|false。

            (5)hibernate.cache.query_cache_factory  實現QueryCache接口的類名,默認是內置的StandardQueryCache。

            (6)hibernate.cache.region_prefix 對于使用二級緩存區域名的前綴。

            (7)hibernate.cache.use_structured_entries 強迫Hibernate在存儲數據到二級緩存時,使用更人性化的格式。取值,true|false。

            4.Hibernate事務屬性

            (1)hibernate.transaction.transaction_class  使用Hibernate事務APIs的TransactionFactory的類名。默認是JDBCTransactionFactory。

            (2)jta.UserTransaction  JTATransactionFactory使用JNDI名字從應用服務器中獲取JTA UserTransaction。取值,jndi/ut。

            (3)hibernate.transaction.manager_lookup_class 是一個TransactionManagerLookup實現類的類名。當JVM級別的緩存開啟時或在JTA環境中使用hilo generator時,要求指定該值。

            (4)hibernate.transaction.flush_before_completion 如果設為true,session將在事務完成階段之前,自動將緩存區的值推入到數據庫中。內置和自動session上下文管理是被優先選用的。取值,true|false。

            (5)hibernate.transaction.auto_close_session 如果設為true,session將在事務完成之后,自動的關閉session。內置和自動session上下文管理是被優先選用的。取值,true|false。

            5.Miscellaneous properties 各種混合的屬性

            (1)hibernate.current_session_context_class 提供一個對于當前session生命周期的策略。取值,jta、thread、managed、定制類名。

            (2)hibernate.query.factory_class 選擇HSQL的解析實現類。取值,org.hibernate.hsql.ast.ASTQueryTranslatorFactory和org.hibernate.hsql.classic.ClassicQueryTranslatorFactory。

            (3)hibernate.query.subsitutions Hibernate中標記符到SQL中標記符的映射。舉例說,可以是函數名或普通字符串名。取值,如hsqLiteral=SQL_LITERAL,hqlFunction=SQLFUN。

            (4)hibernate.hbm2ddl.auto 當SessionFactory被創建時,自動的驗證或輸出模式DDL(也就建表語句)到數據庫中。也就是說,自動的驗證數據庫表結構或先刪除再重新建立,或在原表結構上更新數據表結構。當將值置為create-drop時,在SessionFactory被清除時,將刪除數據庫中表結構。取值,validate、create、update、create-drop。

            (5)hibernate.cglib.use_reflection_optimizer 用CGLIB代替運行期的reflection(系統級屬性)。在有故障時,反射是非常有用的,注意Hibernate總是需要CGLIB,甚至在你關閉優化后。你不可以設置這個屬性在hibernate.cfg.xml文件中。

            posted @ 2009-07-17 17:19 小果子 閱讀(169) | 評論 (0)編輯 收藏

            Hibernate文檔筆記共分為三個部分,此處是第二部分,講述了Contextual Sessions、Configuration、獲取SessionFactory和JDBC Connections(Session是對JDBC連接的封裝)。

            五、Contextual Sessions

            許多應用程序需要一種和上下文有關聯Hibernate session,這樣的session是指貫穿于給定環境的上下文中都有效的session。無論如何,貫穿于應用程序應用上下文由什么組成的清晰度不同,不同的上下文針對當前的概念有不同的范圍。

            使用Hibernate 3.0以前版本的應用程序,趨于使用自已實現的基于ThreadLocal來維護前后關系的session、諸如HibernateUtil的幫助類;或使用基于代理或攔截機制的第三方的框架(Spring或Pico)。

            從Hibernate 3.0.1,Hibernate加入了SessionFactory.getCurrentSession()方法。最初,假定使用JTA事務定義了當前session的scope和context。Hibernate團隊維護時,給定了成熟的卓越的JTA TransactionManager的實現方式,多數(但不是所有)應用程序應該使JTA transaction management,不論它是否發布到一個JEE容器中。基于這一點,基于用JTA來維護上下文關系中的session應該是必須的。

            無論如何,在Hibernate 3.1,SessionFactory.getCurrentSession()之后的處理,是可以被插拔的,也就是說可以session的范圍和上下文。新擴展接口(org.hibernate.context.CurrentSessionContext)和新的配置參數(hibernate.current_session_context_class)被加入,允許插拔,也就是說可以定義session的范圍和上下文。

            細節可以查看org.hibernate.context.CurrentSessionContext的文檔。它定義了一個currentSession()方法,負責跟蹤與當前上下文相關聯的session。Hibernate提供了這個接口的三種實現方式。

            1.org.hibernate.context.JTASessionContext

            當前session,通過JTA事務跟蹤和標識生命周期。這里的處理過程在處理方法上和老JTA是相似的。

            2.org.hibernate.context.ThreadLocalSessionContext

            當前session,通過當前執行的線程來跟蹤。

            3.org.hibernate.context.ManagedSessionContext

            當前session,通過當前執行的線程來跟蹤。你是負責綁定和解除當前session到執行線程通過使用這個類的靜態方法。該類不會open、flush、close session。

            前兩個實現類,提供了“一個session對應一個數據庫事務”的編程模式,也就是眾所周知的“session-per-request”模式。Hibernate session的開始和結束,是以數據庫中事務的執行時間為依據的。如果你使用編程方式劃分事務,用簡單的JSE需不是JTA,你應該考慮使用Hibernate事務APIs來隱藏低層的事務代碼。如果你使用的是JTA,使用JTA的接口來劃分事務。如果你在一個支持CMT(Container Management Transaction)的容器運行程序,事務是通過聲明定義,在你程序中不需要任何的代碼來劃分事務。

            Hibernate.current_session_context_class參數應該指定,一個org.hibernate.context.CurrentSessionContext的實現類。如果配置參數沒有被設置,而是配置了一個org.hibernate.transaction.TransactionManagerLookup被設置,Hibernate將使用org.hibernate.context.JTASessionContext,這里要考慮向后兼容。典型的情況下,這個參數是使用的類的名字。對于Hibernate提供的三個實現類,有對應的三個簡短名,“jta”、“thread”、“managed”。

            六、Configuration

            1.編程配置

            一個org.hibernate.cfg.Configuration的實例表示一個應用程序的所有Java類型到數據庫類型的映射。org.hibernate.cfg.Configuration是用來建造一個org.hibernate.SessionFactory。被編譯的映射是來自所有的XML映射文件。

            片斷1.

            1. Configuration cfg = new Configuration().addResource(“test.hbm.xml”); 

            片斷2.

            1. Configuration cfg = new Configuration().addClass(com.test.class); 

            片斷3.

            1. Configuration cfg = new Configuration().setProperty(“hibernate.dialect”, “org.hibernate.dialect.DB2Dialect”); 

            Configuration可以接收的選項:

            (1)傳遞一個java.util.Properties到Configuration.setProperties()。

            (2)放一個hibernate.properties文件到類路徑的根目錄。

            (3)設置系統properties,通過java –Dproperty=value。

            (4)包含<:property>標簽指定值在hibernate.cfg.xml文件。

            org.hibernate.cfg.Configuration對象是有意作為一個開始時間生成的對象的,一旦SessionFactory被創建,他將被拋棄掉。

            七、獲取SessionFactory

            當org.hibernate.cfg.Configuration解析完所有的映射文件后,應用程序應該獲取一個org.hibernate.Session實例的工廠。這個工廠是被應用程序的所有線程共享的。

            1. SessionFactory sessionFactory = cfg.buildSessionFactory(); 

            Hibernate允許應用程序實例多個SessionFactory。對于使用多個數據庫的應用程序是非常有用的。

            八、JDBC Connections(Session是對JDBC連接的封裝)

            通常,你應該使用org.hibernate.SessionFactory來創建或共享JDBC。如果這采用這種方法,是非常簡單的。

            1. Session session = sessionFactory.openSession(); 

            當你的操作需要訪問數據庫時,一個JDBC連接就會從連接池中被獲取。

            對于這個工作,我們應該給Hibernate提供一些JDBC連接屬性。所有的Hibernate屬性名和語義學都被定義在org.hibernate.cfg.Environment。我們現在描述對于JDBC連接配置的一些更重要的設置。

            1.如果你設置以下屬性,Hibernate將獲取或共享連接使用java.sql.DriverManager:

            1. hibernate.connection.driver_class  
            2.  
            3. hibernate.connection.url  
            4.  
            5. hibernate.connection.username  
            6.  
            7. hibernate.connection.password  
            8.  
            9. hibernate.connection.pool_size 

            Hibernate自己擁有的連接池算法是沒有發展的。他是為了你的初始接觸使用的,而不是為了你的產品使用的,甚至性能測試時使用。為了更好的性能和穩定性考慮,你應該使用第三方的連接池產品。只需要替換hibernate.connection.pool_size屬性的設置用相應連接池的設置。這將關閉Hibernate內部的連接池。例如,可以使用C3P0。

            C3P0是一個開源的JDBC連接池,被放置在Hibernate發布文件的lib目錄下,隨Hibernate一塊發行。如果你設置hibernate.c3p0.*屬性,Hibernate將會使用org.hibernate.connection.C3P0ConnectionProvider為共享連接。如果你想使用proxool作為連接池,你可以通過查閱hibernat.properties或Hibernate站點獲取需要設置的屬性名設置。

            C3P0配置舉例,屬性文件片斷:

            1. hibernate.connection.driver_class=  
            2.  
            3. hibernate.connection.url=  
            4.  
            5. hibernate.connection.username=  
            6.  
            7. hibernate.connection.password=  
            8.  
            9. hibernate.c3p0.min_size=  
            10.  
            11. hibernate.c3p0.max_size=  
            12.  
            13. hibernate.c3p0.timeout=  
            14.  
            15. hibernate.c3p0.max_statements=  
            16.  
            17. hibernate.dialect= 

            2.對于在應用服務器內運行的程序,多數情況你應該配置Hibernate通過JNDI找到服務器的javax.sql.DataSource來獲取連接。你需要設置以下屬性。

            1. hibernate.connection.datasource  
            2.  
            3. hibernate.jndi.url  (可選)  
            4.  
            5. hibernate.jndi.class  (可選)  
            6.  
            7. hibernate.connection.username  (可選)  
            8.  
            9. hibernate.connection.password  (可選) 

            你可以通過實現org.hibernate.connection.ConnectionProvider來定義自己的獲得連接的策略。通過hibernate.connection.provider_class配置使用自己的定義起作用。

            posted @ 2009-07-17 17:18 小果子 閱讀(162) | 評論 (0)編輯 收藏

            Hibernate文檔筆記共分為三個部分,此處是第一部分,講述了對象定義、實例狀態、JMX集成和JCA 支持四個部分的內容。

            一、對象定義

            1.org.hibernate.SessionFactory

            對于單個數據庫,被編譯的映射,是一個線程安全的緩沖區。是一個Session和ConnectionProvider客戶端的工廠。擁有可選的對過程級和集群級重復利用的數據的緩存(二級緩存)。

            2.org.hibernate.Session

            單線程、短生命周期的在應用程序和持久化存儲系統之間的一個會話對象。封裝了一個JDBC連接。是一個事務的工廠。擁有強制的對持久化對象的緩存(一級緩存),當通過標識瀏覽對象之間關系和查找對象時使用。

            3.Persistent objects and collections

            包含執久化狀態和業務功能的短生命周期的、單線程對象。可以是POJOs,通常是和Session(嚴格說,是單個Session)相關聯的對象。Session一關閉,他們將和Session分離,可以自由的使用在應用層的任何地方。(也就是說,作為傳輸對象使用(Transfer Object)。)

            4.Transient and detached objects and collections

            不和當前Session關聯的持久化類的實例。他們可以被應用程序在不持久化時實例化,也可以被關閉的Session實例化。

            5.org.hibernate.Transaction (可選)

            應用程序用來指定一個原子操作的單線程、短生命周期的對象。低層JDBC、JTA、CORBA事務的抽象程序。在相似的情況下,一個Session可以同時橫跨多個事務。事務劃分,既可以使用低層的APIs,也可以使用Transaction。

            6.org.hibernate.connection.ConnectionProvider (可選)

            JDBC連接或JDBC連接池的工廠。低層DataSource和DriverManager的抽象程序。

            這個對象不暴露給應用程序,但是應用程序可以被開發者繼承和實現。

            7.org.hibernate.TransactionFactory (可選)

            Transaction實例的工廠。這個對象不暴露給應用程序,但是應用程序可以被開發者繼承和實現。

            二、實例狀態

            持久化對象根據持久化上下文的定義,可以有三種不同的狀態。Hibernate Session對象是一個持久化上下文。

            1.transient

            不關聯任何的持久化上下文。沒有持久化的標識(指主鍵值Primary key value)。

            2.persistent

            和當前持久化上下文關聯。他有一個持久化標識,多數情況,在數據庫中有對應的行。對于特定的持久化上下文,Hibernate保證持久化標識和Java標識(內存中對象的位置)相同。

            3.detached

            曾經和一個持久化上下文關聯,持久化上下文關閉;或者對象在另一個進程中被序列化。他擁有持久化標識,多數情況,在數據庫中有對應的行。對于分離對象Hibernate不保證持久化標識和Java標識的對應關系。

            三、JMX集成

            JMX是Java組件管理的JEE標準。Hibernate可以被JMX服務管理。在發行版本中,Hibernate提供了一個MBean的實現,org.hibernate.jmx.HibernateService。

            在JBoss上,你使用JMX可以得到的好處:

            1.Session Management

            Hibernate Session的生命周期可以自動的綁定到JTA事務范圍。這意味著,你不需要手動的打開關閉Session,這成為JBoss EJB攔截器的要完成的工作。在你的代碼中,也不用擔心事務的劃分,當然除非你想要寫一個輕便的持久化層,通過使用Hibernate Transaction APIs。你可以調用HibernateContext來訪問Session。

            2.HAR deployment

            通常使用JBoss Service Deployment Descriptor(在EAR或SAR文件中)發布Hibernate JMX Service,它支持Hibernate SessionFactory所有的常用配置選項。無論如何,你還需要在deployment descriptor中描述所有的映射文件。如果你使用可選的HAR Deployment,JBoss將自動檢測所有的映射文件在HAR文件中。

            四、JCA 支持

            Hibernate也可以配置作為一個連接器。該功能是實踐型功能。

            以上四個方面的內容組是我的Hibernate文檔筆記的第一部分,想更多的了解,請關注其他兩個部分。

            posted @ 2009-07-17 17:17 小果子 閱讀(104) | 評論 (0)編輯 收藏

            用Hibernate肯定會頻繁的用到session,下面就將Hibernate session中一些經常的用方法逐個的解釋一下。

            Transaction beginTransaction()

            開始一個工作單元并返回一個與之相關Transaction對象,最為事務的開始,通常在需要對數據庫進行更改例如save,update或delete時使用。在事務結束后需要調用Transaction的commit方法提交更改,該方法必須在Hibernate session關閉之前使用。

            void flush() void clear()

            這兩個方法通常在一起使用。由于Hibernate有緩存數據的功能,所以當我們要批量查詢和批量插入時,會因為大量的緩存而導致內存溢出。所以我們可以在執行批量插入時插入一定數目的數據后調用flush()提交插入,然后調用clear()清空當前Hibernate session內的所有緩存。批量查詢同理

            Connection close()

            關閉Hibernate session,同時清空所有的緩存。

            Connection connection()

            獲取當前Hibernate session使用的JDBC connection。

            boolean contains(Object object)

            返回boolean值,判斷一個實例是否與當前Hibernate session保持關聯,即為持久化狀態。

            Query createQuery(String queryString)

            返回一個給定HQL語句的Query對象。

            SQLQuery createSQLQuery(String queryString)

            返回一個用于執行原生SQL語句的SQLQuery對象

            void delete(Object object)

            刪除與該對象關聯的數據里內的一條記錄。該對象可以是處于持久化狀態也可以是處于瞬態但與數據庫的記錄有id聯系。如果該對象的cascade屬性為delete或all將會同時刪除相關聯的數據。

            void delete(String entityName, Object object)

            不太明白什么意思,占個位。

            Connection disconnect()

            斷開與session與當前JDBC的連接,如果連接有Hibernate管理,則將連接送回連接池,否則將送回給程序本身。

            Object get(Class clazz, Serializable id)

            根據指定的實體類以及實體id返回一個實體的實例。如果找不到記錄則返回null

            Object get(String entityName, Serializable id)

            同上,entity為實體的名字

            String getEntityName(Object object)

            返回一個持久化類的實體名

            Serializable getIdentifier(Object object)

            返回一個被session緩存的實體實例的id

            Query getNamedQuery(String queryName)

            返回一個在映射文件中定義的命名查詢的query對象

            SessionFactory getSessionFactory()

            獲取生成當前session的SessionFactory

            Transaction getTransaction()

            不說了,地球人都知道

            Object load(Class theClass, Serializable id)

            Object load(String entityName, Serializable id)

            和get方法一個效果,不同的是該方法在找不到對應記錄時會拋出異常

            Serializable save(Object object)

            將一個實體實例持久化,返回該持久化實例的id。在持久化之前必須手動或自動的指派id。

            void update(Object object)

            通過給定的分離狀態的實例的id更新數據庫記錄。如果在持久化類中有相同的id則會拋出異常。如果這個實例cascade設置為save-update或all是將同時更新所有關聯的實例記錄。

            void saveOrUpdate(Object object)

            posted @ 2009-07-17 17:16 小果子 閱讀(299) | 評論 (0)編輯 收藏
            僅列出標題
            共58頁: First 39 40 41 42 43 44 45 46 47 Last 
            av无码久久久久不卡免费网站| 国産精品久久久久久久| 久久精品国产AV一区二区三区| 久久人与动人物a级毛片| 99国产欧美精品久久久蜜芽| 久久免费精品视频| 久久这里只精品99re66| jizzjizz国产精品久久| 日本精品久久久久影院日本| 99久久人妻无码精品系列| 国产午夜电影久久| 久久亚洲精品无码AV红樱桃| 久久精品国产72国产精福利| 成人久久免费网站| 久久精品国产一区二区三区不卡| 国产A级毛片久久久精品毛片| 超级碰久久免费公开视频| 一本一本久久A久久综合精品| 人人狠狠综合久久亚洲88| 久久大香萑太香蕉av| 成人国内精品久久久久影院VR| 久久久精品人妻一区二区三区蜜桃 | 久久国产精品一国产精品金尊| 精品久久久久久无码国产| 久久久婷婷五月亚洲97号色| 日韩十八禁一区二区久久| 伊人久久大香线焦综合四虎| AV无码久久久久不卡蜜桃| 蜜臀久久99精品久久久久久| 久久精品视频网| 久久ZYZ资源站无码中文动漫| 国产成人精品综合久久久| 亚洲国产成人精品91久久久| 97久久精品人人澡人人爽| 蜜桃麻豆www久久| 青青青国产成人久久111网站| 99国产欧美久久久精品蜜芽| 91视频国产91久久久| 99久久久精品| 秋霞久久国产精品电影院| 久久综合九色综合久99|