首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails中的PooledConnection问题与MultiTenancy

Grails中的PooledConnection问题与MultiTenancy
EN

Stack Overflow用户
提问于 2021-11-02 09:51:31
回答 1查看 47关注 0票数 0

当我尝试第二次访问多租户域‘成员’时,我得到了一个“池连接已经关闭”的问题。我在MySQL数据库中使用Grails3.3.11。我不知道我做错了什么。

I有一个控制器定义如下-

代码语言:javascript
复制
@CurrentTenant
class GroupController{
 def save(){
   groupService.getMember()
   groupService.updateMember()
 }
}

I有一个定义为-的服务

代码语言:javascript
复制
@Transactional
class GroupService{
 def getMember(){
   return Member.createCriteria().list{
     eq('customer','test')
   }
 }

 def updateMember(){
   Member.executeUpdate("Update member set group='testGroup'")
 }
}

当我点击updatemember()函数时,我得到了以下错误-

代码语言:javascript
复制
PooledConnection has already been closed.. Stacktrace follows:
java.lang.reflect.InvocationTargetException
    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:967)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:54)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
    at grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter.doFilter(UpdateRequestContextHolderExceptionTranslationFilter.groovy:64)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at grails.plugin.springsecurity.web.filter.GrailsHttpPutFormContentFilter.doFilterInternal(GrailsHttpPutFormContentFilter.groovy:54)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.groovy:54)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:158)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.deerwalk.impl.CustomCasAuthenticationFilter.doFilter(CustomCasAuthenticationFilter.java:119)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:64)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
    at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
    at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
    at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:97)
    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)

I正在使用多个数据源,它们被定义为-

代码语言:javascript
复制
dataSource:
  pooled: true
  driverClassName: com.mysql.cj.jdbc.Driver
  #dbCreate: "update"
  url: jdbc:mysql://localhost:3306/index?zeroDateTimeBehavior=convertToNull&autoReconnect=true&relaxAutoCommit=true&useSSL=false
  username: root
  password: root
  properties:
    initialSize: 5
    maxActive: 100
    minIdle: 5
    maxIdle: 25
    maxWait: 10000
    maxAge: 10 * 60000
    timeBetweenEvictionRunsMillis: 1800000
    minEvictableIdleTimeMillis: 1800000
    validationQuery: "SELECT 1"
    validationInterval: 15000
    testWhileIdle: true
    testOnBorrow: true
    testOnReturn: false
    jdbcInterceptors: ConnectionState
    defaultTransactionIsolation: java.sql.Connection.TRANSACTION_READ_COMMITTED
dataSources:
 
  shard1:
    url: jdbc:mysql://localhost:3306/shard1?zeroDateTimeBehavior=convertToNull&autoReconnect=true&relaxAutoCommit=true&useSSL=false
    dbCreate: none

  shard2:
    url: jdbc:mysql://localhost:3306/shard2?zeroDateTimeBehavior=convertToNull&autoReconnect=true&relaxAutoCommit=true&useSSL=false
    dbCreate: none
EN

回答 1

Stack Overflow用户

发布于 2021-11-02 10:24:32

尝试在控制器和服务之间引入一个额外的层。创建一个将由控制器调用的新类,并在新类中添加引入currentTenant注释,我过去已经以类似的方式解决了这个问题,但是我不知道为什么会解决这个问题。

例:-

代码语言:javascript
复制
class GroupController{
    def save(){
      new GroupHandler().handleSave();
    }
  }
    
@CurrentTenant
class GroupHandler{
    
  def groupService // initialize service bean here 
  def handleSave(){
       groupService.getMember()
       groupService.updateMember()
    }
    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69808378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档