Skip to content

Problem With Multiple Datasources #11798

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
jeffscottbrown opened this issue May 4, 2021 · 5 comments
Open

Problem With Multiple Datasources #11798

jeffscottbrown opened this issue May 4, 2021 · 5 comments

Comments

@jeffscottbrown
Copy link
Contributor

jeffscottbrown commented May 4, 2021

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

@puneetbehl
Copy link
Contributor

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

@puneetbehl
Copy link
Contributor

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) {
    ...

@jeffscottbrown
Copy link
Contributor Author

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

@jprabawa
Copy link

@osscontributor did u manage solve this?

@jeffscottbrown
Copy link
Contributor Author

@osscontributor did u manage solve this?

I did not (I am osscontributor).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants