Grails 4.0.3 多数据源 - 第二个数据源在服务中不可用
Grails 4.0.3 Multiple Datasources - Second datasource not available in service
我遵循了 Grails Doc (https://docs.grails.org/4.0.3/guide/conf.html#multipleDatasources) 中的 instructions/example,它仍然使用默认数据源。
我的 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
当我转出 dataSource 的连接字符串信息时,我可以看到它是列出的第一个数据源,而不是 identityDb 数据源。我没有使用域 类 或 GORM,只是直接写 SQL。如有任何帮助,我们将不胜感激!
编辑/更新
我将服务更改为以下内容,现在可以正常工作了。我以为我以前试过这个,但我一定没有得到正确的组合。
请注意 application.yml 没有改变。
class图片服务{
def grails应用程序
def assetResourceLocator
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 中使用第二个数据源的内容不同。
我遵循了 Grails Doc (https://docs.grails.org/4.0.3/guide/conf.html#multipleDatasources) 中的 instructions/example,它仍然使用默认数据源。
我的 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
当我转出 dataSource 的连接字符串信息时,我可以看到它是列出的第一个数据源,而不是 identityDb 数据源。我没有使用域 类 或 GORM,只是直接写 SQL。如有任何帮助,我们将不胜感激!
编辑/更新
我将服务更改为以下内容,现在可以正常工作了。我以为我以前试过这个,但我一定没有得到正确的组合。
请注意 application.yml 没有改变。
class图片服务{ def grails应用程序 def assetResourceLocator 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 中使用第二个数据源的内容不同。