我正在尝试遵循此URI中列出的指南:https://grails.github.io/grails-doc/latest/guide/single.html#multipleDatasources
我的application.yml文件,包含以下数据源描述:
dataSources:
dataSource:
pooled: true
jmxExport: true
driverClassName: org.h2.Driver
username: sa
password:
raw:
dialect: org.hibernate.dialect.Oracle10gDialect
driverClassName: oracle.jdbc.driver.OracleDriver
username: rip
password: password
dbCreate: validate
url: jdbc:oracle:thin:@127.0.0.1:345:coolio
environments:
development:
dataSources:
dataSource:
dbCreate: create-drop
url: jdbc:h2:mem:devDb;MVCC=TRUE
test:
dataSources:
dataSource:
dbCreate: update
url: jdbc:h2:mem:testDb;MVCC=TRUE
production:
dataSources:
dataSource:
dbCreate: update
url: jdbc:h2:mem:prodDb;MVCC=TRUE
在我的DatabaseService中,我有以下代码来尝试并注入dataSource bean:
class DatabaseService {
static datasource = 'raw'
DataSource dataSource
public void testMyDb(User user) {
try {
println("we are in here with : " + dataSource.getConnection().getMetaData().getURL())
registerUser(new Sql(dataSource), user)
} catch (SQLException e) {
LOGGER.error("unable to register the user", e)
throw e
}
}
public void registerDeveloper(Sql sql, User user) {
sql.call("{call isertUser(?)}", [user.name])
}
DatabaseService文件中的print语句打印出来:
we are in here with : jdbc:h2:mem:testDb
但是,它应该打印出来:
we are in here with : jdbc:oracle:thin:@127.0.0.1:345:coolio
我做错了什么?为什么原始的Datasource bean是实例化的?
更新的尝试(1):我在这里看到一个好的主题:https://github.com/grails/grails-core/issues/9690,但即使在更换后
static datasource = 'raw'
带
@Autowired
@Qualifier('dataSource_raw')
没有什么变化。如果我抓住Springs ApplicationContext并打印出bean,那么dataSource_raw确实就是其中之一。
更新后的尝试(2):我试图删除整个环境部分,没有任何变化。
答案 0 :(得分:2)
更新回答:
这似乎是grails 3的错误。不确定它是否已在较新版本中修复(> 3.0.11)。即使我们使用@Autowired and @Qualifier
注释指定bean名称,grails也会在dataSource, transactionManager and sessionFactory
的情况下注入默认bean。这也可能是其他bean的情况,但我只测试了这三个。我没有测试域或控制器的行为。
要解决此问题,您可以使用自定义名称以及@Autowired and @Qualifier
或@Resource
注释,而不是使用这些默认名称。
通过以下方式,您将获得默认数据源的bean,即使您指定使用其他bean:
@Resource(name = "dataSource_raw")
DataSource dataSource
@Resource(name = "transactionManager_raw")
PlatformTransactionManager transactionManager
@Resource(name = "sessionFactory_raw")
SessionFactory sessionFactory
但是使用自定义名称,将注入使用@Qualifier
或@Resource
指定名称的bean:
@Resource(name = "dataSource_raw")
DataSource rawDataSource
@Resource(name = "transactionManager_raw")
PlatformTransactionManager rawTransactionManager
@Resource(name = "sessionFactory_raw")
SessionFactory rawSessionFactory
答案 1 :(得分:0)
您还可以声明如下
def dataSource_raw
没有@Resource
注释