我试图在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身份验证和JTDS。我已经通过第三方客户端对此进行了测试。)
我将此注入我的服务类并使用它,所有内容似乎都很好用:
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语句: ... at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) at 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驱动程序。但是当我尝试使用注入的数据源时事情很奇怪。
知道我在这里做错了吗?
答案 0 :(得分:0)
只是关闭这个循环,并希望将来在这种疏忽中拯救某些人的痛苦:
Grails在运行测试时使用内存数据库。请务必阅读集成测试和生产之间的其他差异: http://www.grails.org/doc/latest/guide/testing.html#integrationTesting
此功能使得在任何测试期间使用外部(只读)数据源非常有趣,但其中一些是可以预期的(从长远来看,依赖于外部数据源的测试不是一个非常好的测试) 。我希望在某些时候重构我的应用程序及其测试方法(例如,在测试期间使用简单的DAO和模拟),因为我并不真正关心从应用程序的测试中断言外部数据源的内容。 / p>