如何在 Grails 3 中获取数据库连接
How to get DB connection in grails 3
在 Grails 3 中获取数据库连接的正确方法是什么?
对于 grails 2 以下代码有效:
((SessionImpl) sessionFactory.getCurrentSession()).connection() // sessionFactory initialized in bootstrap
但是在迁移到 Grails 3 之后,有时我会在日志中看到异常:
java.sql.SQLException: Operation not allowed after ResultSet closed at
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)
at java_sql_ResultSet$getLong.call(Unknown Source)
它发生在 0.01% 的请求中
- Grails 3.2.11
- Gorm 6.0.12
我想这取决于你在哪里需要它,但你可以将数据源注入到服务中。
javax.sql.DataSource dataSource
那你就可以用
dataSource.getConnection()
还要注意 GORM 6 中刷新模式的变化(http://gorm.grails.org/6.0.x/hibernate/manual/ 1.2.1 节)。如果上游 save/commit 失败,您的结果集可能会被意外关闭并触发一个看起来像这样的错误,但实际上与该特定代码行根本没有任何关系。我会(非常暂时地)设置回旧的冲洗模式,看看问题是否消失,然后再进行更多追踪!
从 grails docs,您可以获得实际的数据源 bean。从那里您可以访问连接或使用它来查询您的数据库
import groovy.sql.Sql
def dataSource
println "connection: ${dataSource.connection}"
Sql sql = new Sql(dataSource)
sql.eachRow("SELECT * FROM note") { row ->
println "row: ${row}"
}
使用 'dataSourceUnproxied' 避免 Hibernate 事务和会话问题:
def dataSourceUnproxied
要在当前休眠事务中执行查询,可以使用以下构造:
sessionFactory.currentSession.doWork {connection ->
new Sql(connection).execute(query, params)
}
在 Grails 3 中获取数据库连接的正确方法是什么?
对于 grails 2 以下代码有效:
((SessionImpl) sessionFactory.getCurrentSession()).connection() // sessionFactory initialized in bootstrap
但是在迁移到 Grails 3 之后,有时我会在日志中看到异常:
java.sql.SQLException: Operation not allowed after ResultSet closed at 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) at java_sql_ResultSet$getLong.call(Unknown Source)
它发生在 0.01% 的请求中
- Grails 3.2.11
- Gorm 6.0.12
我想这取决于你在哪里需要它,但你可以将数据源注入到服务中。
javax.sql.DataSource dataSource
那你就可以用
dataSource.getConnection()
还要注意 GORM 6 中刷新模式的变化(http://gorm.grails.org/6.0.x/hibernate/manual/ 1.2.1 节)。如果上游 save/commit 失败,您的结果集可能会被意外关闭并触发一个看起来像这样的错误,但实际上与该特定代码行根本没有任何关系。我会(非常暂时地)设置回旧的冲洗模式,看看问题是否消失,然后再进行更多追踪!
从 grails docs,您可以获得实际的数据源 bean。从那里您可以访问连接或使用它来查询您的数据库
import groovy.sql.Sql def dataSource println "connection: ${dataSource.connection}" Sql sql = new Sql(dataSource) sql.eachRow("SELECT * FROM note") { row -> println "row: ${row}" }
使用 'dataSourceUnproxied' 避免 Hibernate 事务和会话问题:
def dataSourceUnproxied
要在当前休眠事务中执行查询,可以使用以下构造:
sessionFactory.currentSession.doWork {connection ->
new Sql(connection).execute(query, params)
}