Search code examples
grailsgrails-orm

How to get DB connection in grails 3


What is proper way to get DB connection in Grails 3?

For grails 2 following code has works:

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

But after migration to Grails 3 sometimes I see exceptions in the log:

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$3.call(Unknown Source)

It happens for 0,01% of requests

  • Grails 3.2.11
  • Gorm 6.0.12

Solution

  • For executing queries inside current hibernate transactions following construction can be used:

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