代码之家  ›  专栏  ›  技术社区  ›  Langali

使用HibernateTemplate的多值Mysql插入

  •  2
  • Langali  · 技术社区  · 14 年前

    我使用的是springhibernatetemplate,需要每秒向mysql数据库插入数百条记录。

    不确定什么是最有效的方法,但我正在尝试了解多值mysql插入如何使用hibernate。

    String query = "insert into user(age, name, birth_date) values(24, 'Joe', '2010-05-19 14:33:14'), (25, 'Joe1', '2010-05-19 14:33:14')"
    
    getHibernateTemplate().execute(new HibernateCallback(){
     public Object doInHibernate(Session session) throws HibernateException, SQLException {
          return session.createSQLQuery(query).executeUpdate();
     }
    });
    

    '无法执行本机批量操作查询。'请检查您的查询。。。。。

    有没有其他方法可以提高性能?我确实尝试过saveOrUpdateAll()方法,但这还不够好!

    5 回复  |  直到 13 年前
        1
  •  1
  •   Matthew Flynn    14 年前

    section 14.1 从Hibernate的文档中:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
        session.save(customer);
    
        if ( i % 20 == 0 ) { //20, same as the JDBC batch size
    
            //flush a batch of inserts and release memory:
    
            session.flush();
    
            session.clear();
        }
    }
    tx.commit();
    session.close();
    

    因此,您需要能够传入要持久化的元组集合,将它们构造为持久化对象,然后保存,并以所需的间隔刷新。

    如果这还不够,我建议Hibernate是一个糟糕的解决方案。

        2
  •  0
  •   ebelisle    14 年前

    对于中等数量的数据,比如在报告中,我喜欢springjdbctemplate。

    对于非常大的批量插入,我将生成一个带有制表符分隔值的输入文件(在从数据中筛选出制表符之后),并使用数据库为批量输入提供的任何shell程序,例如MySql的mysqlimport。这两个步骤可以由不同的机器来执行,以适应大量导入的数据。

        3
  •  0
  •   Asaf Mesika    14 年前

    我们使用iBatis通过mySQL获得高性能DML。它比JDBC好,因为它有另一个抽象级别。iBatis具有批处理操作,其中还包括插入。

    只需针对这种情况创建另一个DAO接口,并让它使用iBatis(FooSQLMap,它包含FooDAO)实现它。您可以从服务中调用新的FooDAO,这使得服务调用者看不到它。

        4
  •  0
  •   Joshua Davis    14 年前

    我同意马修·弗林的观点。如果你想直接使用JDBC,那么使用Hibernate没有什么意义。如果将对象映射为实体,则可以使用session.save()成批地持久化它们,每隔一段时间刷新和清除会话,这样就不会耗尽内存。

        5
  •  -1
  •   MJB    14 年前

    HibernateTemplate有一个bulkUpdate方法,该方法应该适用于此