在resources.groovy中定义多个dataSource

时间:2014-10-03 18:12:21

标签: spring grails groovy

我正在尝试在DataSource.groovy中创建多个dataSource:

[1..9].each {
   "dataSource_db$it" {
      driverClassName = 'oracle.jdbc.OracleDriver'
      username = 'xxx${it}xx'
      password = 'xxx${it}xx'
      url = 'jdbc:oracle:thin:@xxx:xxx:xxx'
   }
}

但这不起作用。看起来像groovy代码在DataSource.groovy中不起作用。 因此,我使用另一种方法将bean移动到resources.groovy:

import org.apache.commons.dbcp.BasicDataSource
// Place your Spring DSL code here
beans = {
    [1..9].each {
       "dataSource_db$it"(BasicDataSource) {
       driverClassName = 'oracle.jdbc.OracleDriver'
       username = 'xxx${it}xx'
       password = 'xxx${it}xx'
       url = 'jdbc:oracle:thin:@xxx:xxx:xxx'
    }
  }
}

但是我遇到了另一个无法识别BasicDataSource的问题。我需要安装哪个插件? 我的方法是否正确? 我使用的是Grails 2.4.3。

1 个答案:

答案 0 :(得分:0)

前一阵子我们从Commons池切换到性能更高的Tomcat JDBC Connection Pool。它使用与Commons池大部分相同的语法,因此它具有作为替代品的额外好处,通常不需要除驱动程序类名之外的配置更改。它由Tomcat团队开发,但不需要任何Tomcat依赖项,可以在任何servlet容器中使用。

用于此池实现的类名是org.apache.tomcat.jdbc.pool.DataSource,因此如果您更改为resources.groovy中的类名,那么您将解决该问题。

如果您保留DataSource.groovy版本并运行grails console,请执行

for (name in ctx.beanDefinitionNames.sort()) {
   println name
}

你会发现你最终只得到了一个名字非常奇怪的第二个bean:

dataSource_db[1, 2, 3, 4, 5, 6, 7, 8, 9]

(以及为每个具有类似后缀的DataSource创建的所有其他辅助bean)。

修复类名后resources.groovy发生同样的事情;我假设这里的问题是Spring bean DSL处理程序干扰了Groovy代码,否则它将起作用;我能够使用常规for循环:

for (int i = 1; i < 10; i++) {
   "dataSource_db$i"(BasicDataSource) {
      driverClassName = 'oracle.jdbc.OracleDriver'
      username = 'xxx${it}xx'
      password = 'xxx${it}xx'
      url = 'jdbc:oracle:thin:@xxx:xxx:xxx'
   }
}