Grails 2.4.4 多个数据源、单独的驱动程序、IntegrationSpec

Grails 2.4.4 Multiple datasources, separate drivers, IntegrationSpec

我正在尝试在 Grails 2.4.4 项目中使用多个数据源。根据文档,这应该是可能的:

http://www.grails.org/doc/2.4.4/guide/conf.html#multipleDatasources

我的主要数据源(我想用于所有域 classes 的数据源)目前正在使用 H2,正如默认 DataSource.groovy 配置所配置的那样。我的第二个只读数据源是 SQL 服务器,我试图在我的 DataSource.groovy 配置(由所有环境共享)的顶层声明如下:

ds {
    pooled = true
    dialect = "org.hibernate.dialect.SQLServer2008Dialect"
    driverClassName = "net.sourceforge.jtds.jdbc.Driver"
    url = "jdbc:jtds:sqlserver://myserver:1433/mydb;domain=mydomain;useNTLMv2=true;user=myuser"
    dbCreate = "none"
}

(不要让 URL 让你失望 - 我只需要将 Windows Auth 与 JTDS 一起使用。我也通过第三方客户端对此进行了测试。)

我将它注入到我的服务 class 中并使用它,一切看起来都很好:

def dataSource_ds

def serviceMethod(){
    Sql ds = new Sql(dataSource_ds)
    String query = "SELECT ... "
    def results = ds.rows(query)
    println "Results are ${results.size()}"
    return "Some value"
}

但是,当我尝试从 IntegrationSpec 支持的集成测试访问它时,我注意到我收到了 "schema not found" 查询字符串引用的有效模式的错误,例如 "dbo"。此设置中的任何错误的堆栈跟踪如下所示:

org.h2.jdbc.JdbcSQLException:未找到架构 "DBO"; SQL 声明: ... 在 org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 在 org.h2.message.DbException.get(DbException.java:169) 在 org.h2.message.DbException.get(DbException.java:146) 在 org.h2.command.Parser.readTableOrView(Parser.java:4774) 在 org.h2.command.Parser.readTableFilter(Parser.java:1083) 在 org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1689) 在 org.h2.command.Parser.parseSelectSimple(Parser.java:1796) 在 org.h2.command.Parser.parseSelectSub(Parser.java:1683) 在 org.h2.command.Parser.parseSelectUnion(Parser.java:1526) 在 org.h2.command.Parser.parseSelect(Parser.java:1514) 在 org.h2.command.Parser.parsePrepared(Parser.java:404) 在 org.h2.command.Parser.parse(Parser.java:278) 在 org.h2.command.Parser.parse(Parser.java:250) 在 org.h2.command.Parser.prepareCommand(Parser.java:217) 在 org.h2.engine.Session.prepareLocal(Session.java:414) 在 org.h2.engine.Session.prepareCommand(Session.java:363) ...

为什么这个数据源会尝试使用 H2 驱动程序?

如果相关,我的集成测试如下所示:

void "serviceMethod" () {
    when: "service method is called"
    String response = myService.serviceMethod()
    then: "we should get the appropriate text back"
    response.equals("Some value")
}

如果在服务 class 中,我使用 Groovy Sql 对象的构造函数对连接进行硬编码,则集成测试工作正常,并且任何堆栈跟踪都可以通过 JTDS driver.But 当我尝试使用注入的数据源时,事情很奇怪。

知道我做错了什么吗?

只是为了结束这个循环,并希望在未来避免有人因这种疏忽而痛苦:

Grails 在 运行ning 测试时使用内存数据库。请务必在此处阅读集成测试和生产之间的其他差异: http://www.grails.org/doc/latest/guide/testing.html#integrationTesting

此功能使得在任何测试期间使用外部(只读)数据源非常有趣,但其中一些是可以预料的(依赖外部数据源的测试从长远来看并不是一个很好的测试运行)。我希望在某个时候重构我的应用程序及其测试方法(例如,使用一个简单的 DAO 并在测试期间模拟它),因为我并不真正关心从我的应用程序测试中断言外部数据源的内容。