此解决方案有效,但性能低于预期。返回 200K 行的查询需要几分钟时间,并且会在我的开发盒上占用 CPU。在查询分析器中运行相同的*查询会在 < 1 分钟内返回所有结果。
Class MyController {
def index = {...}
...
def csv = {
...
def rs = DomainClass.createCritera().scroll {}
while(rs.next()){
response.getOutputStream().print(rs.getString(1)\n)
}
...
}
DB = SQL Server 2005 服务器在与我的开发机器分开的专用盒子上。
我还通过 SQL Server Profiler 注意到 gorm/hibernate 正在使用 sp_cursorprepexec 和 sp_cursorfetch 一次读取 128 行结果。如果可以选择,我想尝试不使用光标。
不确定是否是问题,但只能提供帮助。在休眠中,可以将滚动设置为仅向前,但我无法为 grails 找到类似的设置。
原来的休眠问题。
解决方案:绕过休眠。从 10 分钟到 15 秒。
Class MyController {
def DataSource
def index = {...}
...
def csv = {
...
def out = response.getOutoutStream()
Sql sql = new Sql(dataSource)
sql.eachRow("select c1, c2 from t1",{
out.println( it.c1 + "," + it.c2 )
})
...
}
*same = 从 SQL Server Profiler 剪切和粘贴,但不包括包装 sp_cursorprepexec sproc。