pengpenglin
人,必須選擇一種生活方式并有勇氣堅持下去
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 262, comments - 221, trackbacks - 0
【原】RSS工具開發手記(09)---Informa的impl.hibernate包
Informa的core包定義了一系列的核心接口,basic使用基于內存的模式實現了這些接口。但是這些基于內存的實現在應用程序退出或者機器斷電,重啟后將不復存在,所以Informa又提供了另外一個基于Hibernate實現的包:impl.hibernate。
和一般的Hibernate Entity domain一樣,在Informa的impl.hibernate包下,包含了兩種類型的文件:java文件和Hibernate的XML映射文件。
逐個逐個地打開這些java文件和xml文件來看,我發現了幾個特點:
A.多數的Hibernate實現和Basic實現的代碼都是一摸一樣的,這一點并不奇怪。因為本來就是實體bean
B.所有的Hibernate實現都沒有在構造函數中調用IdGenerator生成ID,使用了數據庫生成的Id
在前面一節
《RSS工具開發手記(08)---Informa的build.xml》
中,我們提到了Informa的自定義task:schemaexport。這個task依靠于Hibernate的內在類“org.hibernate.tool.hbm2ddl.SchemaExportTask”在CLASSPATH下搜尋hbm文件,然后把這些映射文件導出為ddl文件。
在這個包里面比較值得研究的有下面幾個:
A.
Channel
B.
ChannelBuilder
C.
ChannelUpdatePeriodUserType
D.
SessionHandler
★Channel
經過和impl.basic包中Channel的比較,發現兩者的實現有如下的不同:
A.
構造方法中多了3個方法,兩個是使用title和location來構造的,一個是使用Element,title,location來構造的
B.
從Hibernate中檢索出來的是不用設置ID的,而從內存中生成的必須使用IdGenerator產生唯一ID
C.
basic實現中沒有getLocationString方法和setLocationString方法
D.
basic實現中沒有getSiteString方法和setSiteString方法
E.basic實現中沒有getGroup方法和setGroup方法
F.
basic實現中沒有getFormatString和setFormatString方法
G.
basic中沒有setItems方法,而且getItems方法中的實現不同(basic采用了同步的hashset,而hibernate沒有)
H.
basic中的addItem方法是添加到hashmap,而hibernate中的addItem方法是添加到hashset
I.
basic中的getItem方法是直接從map中根據ID獲取,而hibernate中的getItem是采用Iterator方法輪詢,而且不是從數據庫中獲取
我們來比較這兩個包中構造方法的代碼:
impl.basic包
public
Channel(Element channelElement, String title)
{
this
.id
=
IdGenerator.getInstance().getId();
this
.channelElement
=
channelElement;
this
.title
=
title;
this
.items
=
Collections.synchronizedMap((
new
LinkedHashMap
<
Long, ItemIF
>
()));
this
.categories
=
new
ArrayList
<
CategoryIF
>
();
this
.observers
=
new
ArrayList
<
ChannelObserverIF
>
();
this
.format
=
ChannelFormat.UNKNOWN_CHANNEL_FORMAT;
this
.lastUpdated
=
new
Date();
}
impl.hibernate包
public
Channel(Element channelElement, String title, String location)
{
this
.channelElement
=
channelElement;
this
.title
=
title;
setLocationString(location);
this
.items
=
new
HashSet
<
ItemIF
>
();
this
.categories
=
new
ArrayList
<
CategoryIF
>
();
this
.observers
=
new
ArrayList
<
ChannelObserverIF
>
();
this
.groups
=
new
HashSet
<
ChannelGroup
>
();
this
.format
=
ChannelFormat.UNKNOWN_CHANNEL_FORMAT;
this
.lastUpdated
=
new
Date();
}
首先最明顯的一個區別就是Id的生成不同了,其次在impl.basic中使用同步的HashMap來存儲items,而在impl.hibernate中使用了HashSet。但是在下面impl.hibernate的getItem的方法中,兩者的效率明顯有了區別:
impl.basic
public
ItemIF getItem(
long
anId)
{
return
(ItemIF) items.get(
new
Long(anId));
}
impl.hibernate
public
ItemIF getItem(
long
itemId)
{
//
TODO: improve performance
//
hibernate query cannot be used (not possible: no session object)
//
may be use transient map: items.get(new Long(id));
ItemIF theItem
=
null
;
Iterator it
=
items.iterator();
while
(it.hasNext())
{
ItemIF curItem
=
(ItemIF) it.next();
if
(curItem.getId()
==
itemId)
{
theItem
=
curItem;
break
;
}
}
return
theItem;
}
在Hibernate實現包中,由于使用了HashSet,只能使用逐個迭代的方式來輪詢檢查,當item的數目比較多時,無疑效率被第一種低了很多。在作者的注釋中也提到了可以使用map。特別的這個getItem并非從數據庫的
ITEMS
表取出的。為什么要這樣做呢?
在查看了Channel的xml映射文件后,我有了一點頭緒
<
set
name
="items"
table
="ITEMS"
lazy
="false"
inverse
="true"
cascade
="all-delete-orphan"
>
<
key
column
="CHANNEL_ID"
/>
<
one-to-many
class
="de.nava.informa.impl.hibernate.Item"
/>
</
set
>
注意其中的lazy="false"屬性,這意味著當我們從數據庫中檢索Channel時,對應的item都會被檢出,然后填充到entity bean中,所以此時直接從Channel中的HashSet中拿就可以了。
至于同步方面我想原因可能是:impl.basic包中的實現是在內存中實現的,所以對于items必須進行同步。因此使用了Collections.synchronizedMap對訪問或存儲的item進行同步。而hibernate實現包中由于是Hibernate管理同步,所以不需要顯式地使用Collections.synchronizedSet來同步這個Set。
至于為什么在basic和hibernate包中有些屬性和方法是不存在的,構造方法也有不同,這兩點還有待于和作者探討。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2009-12-28 10:51
Paul Lin
閱讀(233)
評論(0)
編輯
收藏
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
Copyright ©2025 Paul Lin Powered by:
博客園
模板提供:
滬江博客
<
2009年12月
>
日
一
二
三
四
五
六
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(21)
給我留言
查看公開留言
查看私人留言
隨筆分類
J2EE 框架(9)
J2EE基礎(4)
J2SE(43)
Java 工具(5)
Oracle Concept(4)
Oracle SQL/PLSQL(9)
Oracle 開發(13)
Oracle 管理(4)
Oracle 調優
Oracle 錯誤診斷
RoR(19)
UML(3)
Unix / Linux(13)
Web基礎(19)
其它技術(7)
感悟(3)
雜項(7)
架構與性能(8)
模式與重構(19)
灌水(8)
電影與音樂(16)
走過的路(1)
軟件過程與軟件方法(3)
陽光戶外(2)
項目管理(36)
隨筆檔案
2012年2月 (3)
2011年11月 (4)
2011年10月 (1)
2011年9月 (2)
2011年8月 (2)
2011年7月 (5)
2011年6月 (3)
2011年5月 (1)
2011年4月 (1)
2011年3月 (3)
2011年1月 (1)
2010年12月 (1)
2010年11月 (5)
2010年10月 (3)
2010年9月 (1)
2010年7月 (1)
2010年6月 (1)
2010年5月 (4)
2010年4月 (9)
2010年3月 (19)
2010年2月 (8)
2010年1月 (3)
2009年12月 (34)
2009年11月 (1)
2009年10月 (2)
2009年7月 (4)
2009年6月 (5)
2009年5月 (3)
2009年4月 (2)
2009年3月 (1)
2009年2月 (5)
2009年1月 (5)
2008年12月 (13)
2008年11月 (4)
2008年10月 (1)
2008年9月 (6)
2008年8月 (5)
2008年7月 (3)
2008年6月 (31)
2008年5月 (10)
2008年4月 (9)
2008年3月 (7)
2008年2月 (4)
2008年1月 (19)
BlogJava熱點博客
BeanSoft
Jack.Wang
如坐春風
詩特林
鄭暉
銀河使者
阿密果
隔葉黃鶯
好友博客
無羽蒼鷹
搜索
最新評論
1.?re: 【Java基礎專題】編碼與亂碼(01)---編碼基礎[未登錄]
666666666666666666666這幾天正在做個類似工程編碼出現錯誤
--李
2.?re: 【Java基礎專題】IO與文件讀寫---使用Apache commons IO簡化文件讀寫
不錯
--阿斯蘭
3.?re: 【Java基礎專題】編碼與亂碼(03)----String的toCharArray()方法
多謝分享
--thx
4.?re: 【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉換
評論內容較長,點擊標題查看
--karl
5.?re: 【Java基礎專題】編碼與亂碼(01)---編碼基礎[未登錄]
謝謝,幫了我大忙!
--小龍
閱讀排行榜
1.?Oracle中如何插入特殊字符:& 和 ' (多種解決方案)(48446)
2.?getOutputStream() has already been called for this response的解決方法(43350)
3.?【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉換(37031)
4.?360安全衛士誤刪audiosrv.dll文件造成系統無聲的解決方案(21267)
5.?Java中讀取字節流并按指定編碼轉換成字符串的方法(17318)
評論排行榜
1.?360安全衛士誤刪audiosrv.dll文件造成系統無聲的解決方案(33)
2.?【原】Oracle開發專題之:時間運算(11)
3.?【Java基礎專題】編碼與亂碼(05)---GBK與UTF-8之間的轉換(11)
4.?getOutputStream() has already been called for this response的解決方法(10)
5.?【原】Oracle開發專題之:分析函數(OVER)(8)
主站蜘蛛池模板:
成人免费无码大片a毛片
|
亚洲欧洲无码AV电影在线观看
|
成人免费在线看片
|
亚洲精品在线免费看
|
性生大片视频免费观看一级
|
亚洲欧洲视频在线观看
|
麻豆亚洲av熟女国产一区二
|
亚洲午夜av影院
|
国产精品视_精品国产免费
|
精品久久久久久久免费人妻
|
国产成人精品高清免费
|
免费A级毛片无码久久版
|
亚洲AV无码成H人在线观看
|
亚洲1234区乱码
|
久久久亚洲欧洲日产国码农村
|
亚洲av永久无码精品秋霞电影影院
|
亚洲AV无码一区二区二三区入口
|
亚洲精品无码不卡
|
亚洲爆乳精品无码一区二区三区
|
男女超爽刺激视频免费播放
|
91免费资源网站入口
|
中文字幕在线免费观看
|
国产午夜精品免费一区二区三区
|
人人揉揉香蕉大免费不卡
|
精品女同一区二区三区免费站
|
毛片免费视频播放
|
国产香蕉免费精品视频
|
成人啪精品视频免费网站
|
亚洲成AV人在线观看网址
|
国产精品亚洲片在线
|
亚洲另类春色校园小说
|
亚洲综合久久成人69
|
亚洲日本VA午夜在线影院
|
亚洲人成网站18禁止
|
一级看片免费视频
|
免费高清国产视频
|
在线免费观看一级片
|
国产精品另类激情久久久免费
|
亚洲日本韩国在线
|
亚洲欧洲在线播放
|
亚洲国产av一区二区三区丶
|