阅读了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

至于处理速度呢,不会慢到哪儿去的,已经试验过了。; - )
还等什么,赶快试试吧!