【发布时间】:2012-09-11 08:29:58
【问题描述】:
在我的 grails (1.3.7) 应用程序中,我使用 JDBC 模板从 CSV 文件批量导入 1000 条记录(因为它比使用普通 GORM/hibernate 快得多,正如您所期望的那样)。
例如
class Book {
String title
}
和
// For each CSV record...
insertStatementList.add("insert into book (id, title) values (nextval('hibernate_sequence'), thetitle)")
...
JdbcTemplate bulkInsert = ...
bulkInsert.batchUpdate(insertStatementList)
这种方法的问题在于域类的更改(例如添加subject 属性)需要同时更改域类和 SQL 插入语句。
由于 GORM/hibernate 堆栈最终必须从域类定义派生 SQL,有没有办法访问此功能,以便我不必单独维护 SQL 插入语句?或者在伪代码中,可能类似于以下内容:
// would return something like:
// "insert into book (id, title) values (nextval('hibernate_sequence'), 'thetitle')"
def insertStatement = hibernate.getSqlInsertForClass(Book, book.properties)
【问题讨论】:
-
我不知道你的优化要求是什么,但你仍然可以使用hibernate,保持gorm映射的灵活性并获得惊人的性能。考虑一下:naleid.com/blog/2009/10/01/… --- 至于获取休眠插入语句,我认为他们不会为此公开 api,因此您必须拦截日志或 jdbc 驱动程序。挺麻烦的。
-
@Raphael 我已经尝试过链接中的方法(刷新休眠缓存等),但我发现使用 JDBC 模板与 GORM 相比快 3 倍,我的分析器显示大部分额外的时间花在构建 GORM(和相关的)对象上。
-
我应该补充一点,首先使用链接中的方法确实提供了显着的加速 - 但仍然不如 JDBC 模板。
-
你云尝试使用从域映射的持久属性来构建你的 sql 语句。此方法返回这样的列表:new DefaultGrailsDomainClass(YourDomainClazz).persistantProperties
-
@Raphael 感谢您的建议 - 但我认为它并不能真正回答我的问题。是的,我可以编写一些代码来从域类 def 动态构建 SQL,但我的观点是 hibernate 必须已经在这样做(也许不能公开访问,但尽管如此,它正在发生)
标签: hibernate grails grails-orm jdbctemplate