【问题标题】:Grails 4.0.3 Multiple Datasources - Second datasource not available in serviceGrails 4.0.3 多个数据源 - 第二个数据源在服务中不可用
【发布时间】:2020-07-08 20:18:07
【问题描述】:

我已按照 Grails 文档 (https://docs.grails.org/4.0.3/guide/conf.html#multipleDatasources) 中的说明/示例进行操作,它仍然使用默认数据源。

我的 application.yml 包含:

dataSource:
    pooled: true
    jmxExport: true
    dbCreate: validate
    url: jdbc:oracle:thin:@XXX.XX.X.XXX:XXXX:TEST
    username: username1
    password: password1
    driverClassName: oracle.jdbc.OracleDriver
    dialect: org.hibernate.dialect.Oracle10gDialect
    properties:
        jmxEnabled: true
        initialSize: 5
        maxActive: 50
        minIdle: 5
        maxIdle: 25
        maxWait: 10000
        maxAge: 600000
        timeBetweenEvictionRunsMillis: 5000
        minEvictableIdleTimeMillis: 60000
        validationQuery: SELECT 1 FROM DUAL
        validationQueryTimeout: 3
        validationInterval: 15000
        testOnBorrow: true
        testWhileIdle: true
        testOnReturn: false
        jdbcInterceptors: ConnectionState
        defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED
dataSources:
    identityDb:
        url: jdbc:oracle:thin:@YYY.YY.YY.YYY:YYYYY:IDENT
        username: username2
        password: password2

而我的服务定义如下:

class PictureService {
    def grailsApplication
    def assetResourceLocator
    static dataSource = "identityDb"

    def getPictures( identifications ) {
        // Loop through all ids
        for( i in identifications ) {
            //try {
                Sql sql = Sql.newInstance( dataSource )
    ...

它抛出这个堆栈转储:

ORA-00942: table or view does not exist
. 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.doGet(FrameworkServlet.java:898)
        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: java.sql.SQLException: ORA-00942: table or view does not exist

当我转储数据源的连接字符串信息时,我可以看到它是列出的第一个数据源,而不是 identityDb 数据源。我没有使用域类或 GORM,我只是直接编写 SQL。对此的任何帮助将不胜感激!

【问题讨论】:

  • 看起来您引用的 Grails 文档表明该 bean 将是 dataSource_identityDb,而不仅仅是 identityDb。不过我还没试过。
  • 感谢@dsies。你的评论让我走上了正轨。我已经更新了我的问题,以展示我为使其正常工作所做的工作。
  • 不客气,但习惯上赞成回答或评论而不是感谢。如果您解决了您的问题,请添加您所做的答案并将其标记为已接受,而不是编辑问题,这将有助于其他人在未来遇到此问题。欢迎使用 stackoverflow。

标签: grails


【解决方案1】:

编辑/更新

我将我的服务更改为以下内容,它现在可以正常工作。我以为我以前尝试过这个,但我一定没有得到正确的组合。

注意 application.yml 没有改变。

类图片服务{ def grailsApplication def 资产资源定位器 def dataSource_identityDb

def getPictures( identifications ) {
    // Loop through all ids
    for( i in identifications ) {
        try {
            Sql sql = Sql.newInstance( dataSource_identityDb )

... 此外,这与官方文档中列出的在 Grails 4.0.3 中使用第二个数据源的内容不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2012-06-07
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多