如何在grails中获得数据库连接3

时间:2017-07-05 19:02:20

标签: grails gorm

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

对于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 at   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)at at   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)at at   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)at at   com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:743)at at   com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1037)at at   com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2757)at at   com.mchange.v2.c3p0.impl.NewProxyResultSet.getLong(NewProxyResultSet.java:424)   at java_sql_ResultSet $ getLong $ 3.call(Unknown Source)

发生了0,01%的请求

  • Grails 3.2.11
  • Gorm 6.0.12

3 个答案:

答案 0 :(得分:1)

我想这取决于您需要它的位置,但您可以将DataSource注入服务。

javax.sql.DataSource dataSource

然后你可以使用

dataSource.getConnection()

另请注意GORM 6(http://gorm.grails.org/6.0.x/hibernate/manual/第1.2.1节)中刷新模式的更改。如果上游保存/提交失败,您的结果集可能会偶然关闭并触发看起来像这样的错误,而根本没有与此特定代码行有任何关系。我(非常暂时)回到旧的刷新模式,看看问题是否消失,然后再追踪更多!

答案 1 :(得分:0)

从grails docs,您可以获得实际的dataSource 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

答案 2 :(得分:0)

要在当前的休眠事务中执行查询,可以使用以下构造:

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