一.
以Action Script 3.0(简称AS)开发Browser Player时,需要用NetStream,但现在NetStream.play只支持Http和File两种协议。上网检查youtube,tudou和youku,发现他们用的播放协议也都是Http。而以Flash Media Server(简称FMS)或Red5作为流媒体服务器时,它们提供的是RTMP协议,且这两种流媒体服务器是专门做过优化的。这两种协议,HTTP和RTMP,有几点不同:
(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 小果子 阅读(571) |
评论 (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 小果子 阅读(166) |
评论 (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.
- Configuration cfg = new Configuration().addResource(“test.hbm.xml”);
片断2.
- Configuration cfg = new Configuration().addClass(com.test.class);
片断3.
- 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实例的工厂。这个工厂是被应用程序的所有线程共享的。
- SessionFactory sessionFactory = cfg.buildSessionFactory();
Hibernate允许应用程序实例多个SessionFactory。对于使用多个数据库的应用程序是非常有用的。
八、JDBC Connections(Session是对JDBC连接的封装)
通常,你应该使用org.hibernate.SessionFactory来创建或共享JDBC。如果这采用这种方法,是非常简单的。
- Session session = sessionFactory.openSession();
当你的操作需要访问数据库时,一个JDBC连接就会从连接池中被获取。
对于这个工作,我们应该给Hibernate提供一些JDBC连接属性。所有的Hibernate属性名和语义学都被定义在org.hibernate.cfg.Environment。我们现在描述对于JDBC连接配置的一些更重要的设置。
1.如果你设置以下属性,Hibernate将获取或共享连接使用java.sql.DriverManager:
- hibernate.connection.driver_class
-
- hibernate.connection.url
-
- hibernate.connection.username
-
- hibernate.connection.password
-
- 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配置举例,属性文件片断:
- hibernate.connection.driver_class=
-
- hibernate.connection.url=
-
- hibernate.connection.username=
-
- hibernate.connection.password=
-
- hibernate.c3p0.min_size=
-
- hibernate.c3p0.max_size=
-
- hibernate.c3p0.timeout=
-
- hibernate.c3p0.max_statements=
-
- hibernate.dialect=
2.对于在应用服务器内运行的程序,多数情况你应该配置Hibernate通过JNDI找到服务器的javax.sql.DataSource来获取连接。你需要设置以下属性。
- hibernate.connection.datasource
-
- hibernate.jndi.url (可选)
-
- hibernate.jndi.class (可选)
-
- hibernate.connection.username (可选)
-
- hibernate.connection.password (可选)
你可以通过实现org.hibernate.connection.ConnectionProvider来定义自己的获得连接的策略。通过hibernate.connection.provider_class配置使用自己的定义起作用。
posted @
2009-07-17 17:18 小果子 阅读(153) |
评论 (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 小果子 阅读(98) |
评论 (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 小果子 阅读(293) |
评论 (0) |
编辑 收藏