public void importBatch(Collection objs) {
session = this.sessionFactory.openSession();
session.setCacheMode(CacheMode.IGNORE);
session.getTransaction().begin();
for(Object o : objs) {
session.save(o);
if(++saveCount % objs.size() == 0)
{
session.getTransaction().commit();
session.clear();
saveCount = 0;
}
}
session.close();
}
The code above is most certainly not threadsafe. SessionFactory can safely be used as an instance variable, but not the Session. The scope "prototype" means a new instance is created, but per injection, not per request.
另参考:http://www.iteye.com/topic/17801
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tran = session.beginTransaction();
session.setCacheMode(CacheMode.IGNORE);
PreparedStatement stmt;
try {
stmt = session.connection().prepareStatement("INSERT INTO EVENTS(EVENT_DATE, title) VALUES(?,?)");
for (int i = 0; i < 200000; i++) {
stmt.setTimestamp(1, new Timestamp(new Date().getTime()));
stmt.setString(2, "Title["+i+"]");
stmt.addBatch();
}
stmt.executeBatch();
} catch (SQLException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
tran.rollback();
}
tran.commit();
session.close();
HibernateUtil.getSessionFactory().close();