如何在圣杯中获取数据库连接 3.



在Grails 3中获取DB连接的正确方法是什么?

对于 grails 2,以下代码有效:

((SessionImpl) sessionFactory.getCurrentSession()).connection() // sessionFactory initialized in bootstrap

但是迁移到 Grails 3 后,有时我会在日志中看到异常:

java.sql.SQLException:在 ResultSet 关闭后不允许操作 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:743) at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1037) at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2757) at com.mchange.v2.c3p0.impl.NewProxyResultSet.getLong(NewProxyResultSet.java:424) 在 java_sql_ResultSet$getLong$3.call(来源不明)

它发生在 0,01% 的请求中

  • 圣杯 3.2.11
  • 戈姆 6.0.12

我想这取决于您需要它的位置,但是您可以将数据源注入服务中。

javax.sql.DataSource dataSource

然后你可以使用

dataSource.getConnection()

另请注意 GORM 6(http://gorm.grails.org/6.0.x/hibernate/manual/第 1.2.1 节)中对刷新模式的更改。 如果上游保存/提交失败,您的结果集可能会被意外关闭并触发如下所示的错误,而实际上与此特定代码行没有任何关系。 我会(非常暂时地)设置回旧的刷新模式,看看问题是否消失,然后再跟踪更多!

从 grails 文档中,您可以获得实际的数据源 bean。从中您可以访问连接或使用它来查询您的数据库

import groovy.sql.Sql def 数据源 println "connection: ${dataSource.connection}" Sql sql = new Sql(dataSource) sql.eachRow("SELECT * FROM note") { row -> println "row: ${row}" }

使用"dataSourceUnproxied"以避免休眠事务和会话问题:

def dataSourceUnproxied

为了在当前休眠事务中执行查询,可以使用构造后:

sessionFactory.currentSession.doWork {connection -> 
new Sql(connection).execute(query, params)
}

相关内容

  • 没有找到相关文章

最新更新