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 并在测试期间模拟它),因为我并不真正关心从我的应用程序测试中断言外部数据源的内容。
我正在尝试在 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 并在测试期间模拟它),因为我并不真正关心从我的应用程序测试中断言外部数据源的内容。