使用HibernateTemplate的多值Mysql插入

使用HibernateTemplate的多值Mysql插入,hibernate,spring,java,Hibernate,Spring,Java,我正在使用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

我正在使用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();
 }
});
但我得到了这个错误: '无法执行本机批量操作查询。'请检查您的查询

你知道我可以使用Hibernate使用多值mysql插入吗?还是我的疑问不正确

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

来自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();
Session Session=sessionFactory.openSession();
事务tx=会话.beginTransaction();
对于Hibernate文档中的(int i=0;i)

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();
Session Session=sessionFactory.openSession();
事务tx=会话.beginTransaction();

对于(inti=0;i我倾向于只对单个对象操作使用Hibernate

对于中等数量的数据,如报告中的数据,我喜欢SpringJDBCTemplate


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

我倾向于只使用Hibernate进行单对象操作

对于中等数量的数据,如报告中的数据,我喜欢SpringJDBCTemplate


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

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

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

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


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

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


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

我同意Matthew Flynn的观点。如果您直接转到JDBC,那么使用Hibernate没有多大意义。如果您的对象映射为实体,您可以使用session.save()持久化它们成批地,每隔一段时间刷新和清除会话,这样就不会耗尽内存。

我同意Matthew Flynn的观点。如果您打算直接转到JDBC,那么使用Hibernate没有多大意义。如果您希望对象映射为实体,则可以使用session.save()持久化它们成批地,每隔一段时间刷新和清除会话,这样就不会耗尽内存。

您找到解决方案了吗?我确信您真正的代码不会这样做,而是使用准备好的语句,否则您会将查询缓存从水中吹走……而且您会让自己到处接受sql注入。cf小鲍比桌子。()+1对于Bobby Tables referencePiss,请尽一切可能关闭。谢谢。如果你想删除一个问题,只需删除它。不要简单地编辑内容;问题历史记录会被保留。你找到解决方案了吗?我相信你真正的代码不会这样做,而是使用准备好的语句,否则你会破坏查询cac他离开了水……而你却让自己到处都有sql注入的机会+1对于Bobby Tables Reference,请尽一切可能关闭。谢谢。如果您想删除一个问题,请将其删除。不要简单地编辑内容;问题历史记录会被保留。这是使用HQL,Langali正在通过SQL进行尝试。请阅读文档。这是使用HQL,Langali正在通过SQL进行尝试。请阅读文档ion。运行mysqlimport是我们发现的将数据导入数据库的最快方法。准备输入文件的时间花费在不同的机器上,因此此解决方案可以更好地扩展到多个导入作业。运行mysqlimport是我们发现的将数据导入数据库的最快方法。准备输入文件的时间花费在在不同的机器上,因此此解决方案可以更好地扩展到多个导入作业。