2014-10-03 50 views
0

多个数据源,我想在DataSource.groovy中像创建多个数据源:定义在resources.groovy

[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中不起作用。 所以,我用另一种选择移动这个通过指定豆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。

回答

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 beans DSL处理程序干扰了Groovy代码,否则这些代码可能会工作;我能够得到它与正常的循环工作:

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' 
    } 
}