阅读了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
* @param objPO Object5
* @return boolean6
*/
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
这只是简单的测试,实际项目中遇到的问题,要比这个复杂得多。
这时候,我们可以让Spring来控制Transaction,自己来控制Hibernate的Session,随时更新数据。
首先,利用HibernateDaoSupport类来自定义个方法打开Session;
1
public Session openSession()
{
2
3
return getHibernateTemplate().getSessionFactory().openSession();
4
5
}
然后,用打开的Session处理你的数据;

public Session openSession()
{2
3
return getHibernateTemplate().getSessionFactory().openSession();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
}

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
}
每做一次数据操作,就更新一次Session,这样可以保证每次数据操作都成功,否则就让Spring去控制它roll back吧。
最后,记得关闭Session。
1
Session session
=
openSession();
2
doBusiness(session);
3
session.close();
//
关闭session
Session session
=
openSession();2
doBusiness(session);3
session.close();
//
关闭session
至于处理速度呢,不会慢到哪儿去的,已经试验过了。; - )
还等什么,赶快试试吧!
本文介绍了一种使用Hibernate进行大数据量操作的方法,通过批量处理减少内存占用,并利用Spring控制事务,确保数据操作的成功率。
958

被折叠的 条评论
为什么被折叠?



