Hibernate大數(shù)據(jù)量操作解決方案(轉(zhuǎn))
閱讀了Hibernate的Reference之后,可以采用批量處理的方法,當(dāng)插入的數(shù)據(jù)超過10000時,就flush session并且clear。
下面是一個測試method。
這只是簡單的測試,實(shí)際項(xiàng)目中遇到的問題,要比這個復(fù)雜得多。
這時候,我們可以讓Spring來控制Transaction,自己來控制Hibernate的Session,隨時更新數(shù)據(jù)。
首先,利用HibernateDaoSupport類來自定義個方法打開Session;
?1
/**?*//**
?2
?????*?測試成批插入數(shù)據(jù)的事務(wù)處理,返回是否成功
?3
?????*?
?4
?????*?@param?objPO?Object
?5
?????*?@return?boolean
?6
?????*/
?7
????public?boolean?insertBatch(final?Object?objPO)?
{
?8
????????boolean?isSuccess?=?false;
?9
????????Transaction?transaction?=?null;
10
????????Session?session?=?openSession();
11
????????try?
{
12
????????????transaction?=?session.beginTransaction();
13
????????????for?(int?i?=?0;?i?<?100000;?i++)?
{
14
????????????????session.save(objPO);
15
????????????????if?(i?%?50?==?0)?
{
16
????????????????????//?flush?a?batch?of?inserts?and?release?memory
17
????????????????????session.flush();
18
????????????????????session.clear();
19
????????????????}
20
????????????}
21
????????????transaction.commit();
22
????????????logger.info("transaction.wasCommitted:"
23
????????????????????+?transaction.wasCommitted());
24
????????????isSuccess?=?true;
25
????????}?catch?(HibernateException?ex)?
{
26
????????????if?(transaction?!=?null)?
{
27
????????????????try?
{
28
????????????????????transaction.rollback();
29
????????????????????logger.error("transaction.wasRolledBack:"
30
????????????????????????????+?transaction.wasRolledBack());
31
????????????????}?catch?(HibernateException?ex1)?
{
32
????????????????????logger.error(ex1.getMessage());
33
????????????????????ex1.printStackTrace();
34
????????????????}
35
????????????}
36
????????????logger.error("Insert?Batch?PO?Error:"?+?ex.getMessage());
37
????????????ex.printStackTrace();
38
????????}?finally?
{
39
????????????if?(transaction?!=?null)?
{
40
????????????????transaction?=?null;
41
????????????}
42
????????????session.close();
43
????????}
44
????????return?isSuccess;
45
????}
46


?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



32

33

34

35

36

37

38



39



40

41

42

43

44

45

46

這只是簡單的測試,實(shí)際項(xiàng)目中遇到的問題,要比這個復(fù)雜得多。
這時候,我們可以讓Spring來控制Transaction,自己來控制Hibernate的Session,隨時更新數(shù)據(jù)。
首先,利用HibernateDaoSupport類來自定義個方法打開Session;
1
public
?Session?openSession()
{
2
????????
3
????????return?getHibernateTemplate().getSessionFactory().openSession();
4
????????
5
????}
然后,用打開的Session處理你的數(shù)據(jù);


2

3

4

5

?1
protected?void?doBusiness(Session?session)?
{
?2
?3
????????while?(true)?
{
?4
????????????//do?your?business?with?the?opening?session????????
?5
????????????someMethod(session);
?6
????????????session.flush();
?7
????????????session.clear();
?8
????????????logger.info("good?job!");????????????
?9
????????}???????
10
}



?2

?3



?4

?5

?6

?7

?8

?9

10

每做一次數(shù)據(jù)操作,就更新一次Session,這樣可以保證每次數(shù)據(jù)操作都成功,否則就讓Spring去控制它roll back吧。
最后,記得關(guān)閉Session。
1
Session?session?
=
?openSession();
2
doBusiness(session);
3
session.close();?
//
關(guān)閉session

2

3

至于處理速度呢,不會慢到哪兒去的,已經(jīng)試驗(yàn)過了。; - )
還等什么,趕快試試吧!
posted on 2007-01-12 15:30 liaojiyong 閱讀(738) 評論(0) 編輯 收藏 所屬分類: Hibernate