閱讀了Hibernate的Reference之后,可以采用批量處理的方法,當插入的數據超過10000時,就flush session并且clear。
下面是一個測試method。
這只是簡單的測試,實際項目中遇到的問題,要比這個復雜得多。
這時候,我們可以讓Spring來控制Transaction,自己來控制Hibernate的Session,隨時更新數據。
首先,利用HibernateDaoSupport類來自定義個方法打開Session;
?1
/**?*/
/**
?2
?????*?測試成批插入數據的事務處理,返回是否成功
?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

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


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

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

2

3

至于處理速度呢,不會慢到哪兒去的,已經試驗過了。; - )
還等什么,趕快試試吧!
?
?????????????????????????????????????????????????????????????????????????????? THE END