grails-core icon indicating copy to clipboard operation
grails-core copied to clipboard

Problem With Multiple Datasources

Open osscontributor opened this issue 3 years ago • 3 comments

grails-app/conf/application.yml#L100-L110

dataSource:
    pooled: true
    jmxExport: true
    driverClassName: org.h2.Driver
    username: sa
    password:

dataSources:
    cars:
        dbCreate: create-drop
        url: jdbc:h2:./carsDB;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE

grails-app/domain/datasourcesdemo/Car.groovy

package datasourcesdemo

class Car {
    String name
    static mapping = {
        datasource 'cars'
    }
}

grails-app/services/datasourcesdemo/CarService.groovy

package datasourcesdemo

import grails.gorm.services.Service
import grails.gorm.transactions.Transactional

@Service(Car)
@Transactional(connection='cars')
interface CarService {

    Car get(Serializable id)

    List<Car> list(Map args)

    Long count()

    void delete(Serializable id)

    Car save(Car car)

}

If I attempt to save new a Car instance using the scaffolding in that project an exception is thrown:

2021-05-04 08:58:48.792 ERROR --- [nio-8080-exec-9] o.g.web.errors.GrailsExceptionResolver   : HibernateException occurred when processing request: [POST] /car/save - parameters:
name: Name
create: Create
No Session found for current thread. Stacktrace follows:

java.lang.reflect.InvocationTargetException: null
        at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
        at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
        at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
        at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.dao.DataAccessResourceFailureException: Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread
        at org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:335)
        at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:284)
        at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:241)
        at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:120)
        at org.grails.orm.hibernate.AbstractHibernateGormValidationApi.validate(AbstractHibernateGormValidationApi.groovy:78)
        at org.grails.orm.hibernate.AbstractHibernateGormValidationApi.validate(AbstractHibernateGormValidationApi.groovy:51)
        at org.grails.orm.hibernate.AbstractHibernateGormValidationApi.validate(AbstractHibernateGormValidationApi.groovy:50)
        at org.grails.datastore.gorm.GormValidateable$Trait$Helper.validate(GormValidateable.groovy:97)
        ... 13 common frames omitted
Caused by: org.hibernate.HibernateException: No Session found for current thread
        at org.grails.orm.hibernate.GrailsSessionContext.currentSession(GrailsSessionContext.java:112)
        at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:475)
        at org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:333)
        ... 20 common frames omitted

Environment Information

  • Grails Version: 4.0.10
  • JDK Version: openjdk version "1.8.0_202"

Example Application

osscontributor avatar May 04 '21 14:05 osscontributor

I looked into it quickly and it seems to be failing with validation which occurs because of using Domain class as command object.

puneetbehl avatar Sep 02 '21 13:09 puneetbehl

Meanwhile, I am looking into this, you can workaround by adding the following on the Controller action:

./grails-app/controllers/datasourcesdemo/CarController.groovy

    @Transactional(connection='cars')
    def save(Car car) {
    ...

puneetbehl avatar Oct 19 '21 20:10 puneetbehl

FYI... I updated the linked project to 5.1.7 and the same issue appears there using GORM 7.2.1.

osscontributor avatar Apr 20 '22 18:04 osscontributor