gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:02:52 26 4
gpt4 key购买 nike

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

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

我的主要数据源(我想用于所有域类的那个)目前正在使用 H2,由默认的 DataSource.groovy 配置配置。我的第二个只读数据源是 SQL Server,我尝试在我的 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 一起使用。我也已通过第三方客户端对此进行了测试。)

我将它注入(inject)我的服务类并使用它,一切看起来都很好:
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 支持的集成测试中访问它时,我注意到我的查询字符串引用的有效模式出现了“找不到模式”错误,例如“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")
}

如果在 Service 类中,我使用 Groovy Sql 对象的构造函数对连接进行硬编码,则集成测试工作正常,并且任何堆栈跟踪都通过 JTDS 驱动程序。但是当我尝试使用注入(inject)的数据源时,事情是奇怪的。

知道我在这里做错了什么吗?

最佳答案

只是为了结束这个循环,并希望在 future 避免有人在这个疏忽上的痛苦:

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

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

关于sql-server - Grails 2.4.4 多个数据源、单独的驱动程序、IntegrationSpec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28356473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com