多个数据源配置 [英] Multiple data sources configuration
问题描述
我在Grails 2.5.1中配置多个DataSources时遇到问题。我使用PostgreSQL 9.4.4,H2DB和休眠4.3.10与GGTS。
我没有找到'TableXX; SQL语句...'的消息,并且在与控制台调试后,我发现会话正在返回错误的驱动程序:
导入teste.PTes;
PTes.withSession {hibernateSession - >
hibernateSession.getJdbcConnectionAccess().availableConnection().getMetaData()。getDriverName()
}
结果:H2 JDBC驱动
该域类应该在使用PostgreSQL驱动程序的Session上运行。
这里是数据源
dataSource {
pooled = true
jmxExport = true
driverClassName =org.h2.Driver
username =sa
password =
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = true
cache.region.factory_class ='org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory'// Hibernate 4
}
//环境特定设置
环境{
开发{
dataSource {
dbCreate =create-drop//创建'create-drop' ,'update','validate',''
url =jdbc:h2:mem:devDb; MVCC = TRUE; LOCK_TIMEOUT = 10000; DB_CLOSE_ON_EXIT = FALSE
logSql = true
}
dataSource_teste {
pooled = true
dialect =org.hibernate.dialect.PostgreSQLDialect
driverClassName:'org.postgresql.Driver'
用户名:'teste'
密码:'teste'
url:'jdbc:postgresql:// localhost:5432 / teste'
dbCreate:'validate'
}
}
test {
dataSource {
dbCreate ='create-drop'
url =jdbc :postgresql:// localhost:5432 / teste; DB_CLOSE_ON_EXIT = FALSE
}
生产{
dataSource {
dbCreate =update
url =jdbc:h2:prodDb; MVCC = TRUE; LOCK_TIMEOUT = 10000; DB_CLOSE_ON_EXIT = FALSE
properties {
//参见http://grails.org/doc/latest/guide/conf。 html#dataSource for documentation
jmxEnabled = true
initialSize = 5
maxActive = 50
minIdle = 5
maxIdle = 25
maxWait = 10000
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
validationQuery =SELECT 1
validationQueryTimeout = 3
validationInterval = 15000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
jdbcInterceptors =ConnectionState
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
}
}
dataSource_teste {
方言:org.hibernate.dialect.PostgreSQL82Dialect
driverClassName:'org.postgresql.Driver'
用户名:'teste'
密码:'teste'
url:'jdbc:postgresql:// localhost:5432 / teste; DB_CLOSE_ON_EXIT = FALSE'
dbCreate:'update'
}
}
}
以下是BuildConfig:
grails.servlet.version =3.0//根据目标容器合规性(2.5或3.0)进行更改
grails.project.class.dir =target / classes
grails.project .test.class.dir =target / test-classes
grails.project.test.reports.dir =target / test-reports
grails.project.work.dir =target /工作
grails.project.target.level = 1.6
grails.project.source.level = 1.6
//grails.project.war.file =target / $ {appName} - $ {appVersion} .war
grails.project.fork = [
//为编译JVM配置设置,请注意,如果您更改了Groovy版本,则需要分叉编译
//编译:[maxMemory:256,minMemory:64,debug:false,maxPerm:256,daemon:true],
//配置测试应用程序JVM的设置,默认使用守护进程
test:[maxMemory:768,minMemory:64,debug:false,maxPerm:256,daemon:true],
//配置集为运行应用程序JVM
运行:[maxMemory:768,minMemory:64,debug:false,maxPerm:256,forkReserve:false],
//配置运行JVM的设置
war:[maxMemory:768,minMemory:64,debug:false,maxPerm:256,forkReserve:false],
//配置Console UI的设置JVM
console:[maxMemory:768 ,minMemory:64,debug:false,maxPerm:256]
]
grails.project.dependency.resolver =maven//或ivy
grails.project.dependency .resolution = {
//继承Grails的默认依赖关系
inherits(global){
//在此指定依赖项排除;例如,取消注释以禁用ehcache:
//排除'ehcache'
}
日志错误// Ivy解析器的日志级别,'error','warn',' info','debug'或'verbose'
checksums true //是否验证解析
上的校验和legacyResolve false //是否在插件安装时执行二级解析,不建议并且为了向后兼容
repositories {
inherits true //是否从插件继承存储库定义
$ b grailsPlugins()
grailsHome()
mavenLocal()
grailsCentral()
mavenCentral()
//取消注释这些(或添加新的)以启用公共Maven仓库中的远程依赖项解析
// mavenRepohttp:// repository。 codehaus.org
mavenRepohttp://download.java.net/maven/2/
//春季安全回购
mavenRepohttp:// repo.spring.io/milestone/
// mavenRepohttp://repository.jboss.com/maven2/
}
依赖关系{
/ /在构建,编译,运行时,测试或提供的范围下指定依赖项
// runtime'mysql:mysql-connector-java:5.1.29'
runtime'org.postgresql:postgresql:9.4-1201-jdbc4'
testorg.grails:grails- datastore-test-support:1.0.2-grails-2.4
插件{
//仅用于构建系统的插件
build:tomcat: 7.0.55.3//或:tomcat:8.0.22
//编译步骤的插件
compile:scaffolding:2.1.2
compile: cache:1.1.8'
// asset-pipeline 2.0+需要Java 7,使用版本1.9.x和Java 6
compile:asset-pipeline:2.2.3
compile :quartz:1.0.2
compile:joda-time:1.5
compile:XXXXXXX-plugin:0.1-SNAPSHOT
$ b $ //在运行时需要插件不适用于编译
runtime:hibernate4:4.3.10//或:hibernate:3.6.10.18
runtime:database-migration:1.4.0
runtime:jquery :1.11.1
// Un评论这些以启用额外的资产管道功能
//编译:sass-asset-pipeline:1.9.0
//编译:less-asset-pipeline:1.10.0
// compile:coffee-asset-pipeline:1.8.0
// compile:handlebars-asset-pipeline:1.3.0.3
}
}
以下是在域类中使用的映射:
静态映射= {
datasource'teste'
表'cd_pt'
id名称:'codPTes'
codPTes列:'cod_p'
$ b 任何人都有线索?
解决方案
通过使用PSQL作为主数据库并将H2作为辅助数据库来完成此项工作。
仍然不知道为什么或者DataSource在配置中有错误(我已经花了3周时间,但它肯定是可能的)。
I'm having trouble with the configuration of multiple DataSources in Grails 2.5.1. I'm using PostgreSQL 9.4.4, H2DB and hibernate 4.3.10 with GGTS.
I'm getting the 'Table "XX" not found; SQL statement...' message and after a debug with the console, I found that the Session is returning the wrong driver:
import teste.PTes;
PTes.withSession { hibernateSession ->
hibernateSession.getJdbcConnectionAccess().obtainConnection().getMetaData().getDriverName()
}
Result: H2 JDBC Driver
This domain class was supposed to run on a Session that uses the PostgreSQL driver.
Here is the DataSource
dataSource {
pooled = true
jmxExport = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache=true
cache.region.factory_class = 'org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory' // Hibernate 4
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
logSql = true
}
dataSource_teste {
pooled = true
dialect="org.hibernate.dialect.PostgreSQLDialect"
driverClassName: 'org.postgresql.Driver'
username: 'teste'
password: 'teste'
url: 'jdbc:postgresql://localhost:5432/teste'
dbCreate: 'validate'
}
}
test {
dataSource {
dbCreate = 'create-drop'
url = "jdbc:postgresql://localhost:5432/teste;DB_CLOSE_ON_EXIT=FALSE"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
properties {
// See http://grails.org/doc/latest/guide/conf.html#dataSource for documentation
jmxEnabled = true
initialSize = 5
maxActive = 50
minIdle = 5
maxIdle = 25
maxWait = 10000
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
validationQuery = "SELECT 1"
validationQueryTimeout = 3
validationInterval = 15000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
jdbcInterceptors = "ConnectionState"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
}
}
dataSource_teste {
dialect: org.hibernate.dialect.PostgreSQL82Dialect
driverClassName: 'org.postgresql.Driver'
username: 'teste'
password: 'teste'
url: 'jdbc:postgresql://localhost:5432/teste;DB_CLOSE_ON_EXIT=FALSE'
dbCreate: 'update'
}
}
}
Here is the BuildConfig:
grails.servlet.version = "3.0" // Change depending on target container compliance (2.5 or 3.0)
grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports"
grails.project.work.dir = "target/work"
grails.project.target.level = 1.6
grails.project.source.level = 1.6
//grails.project.war.file = "target/${appName}-${appVersion}.war"
grails.project.fork = [
// configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required
// compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
// configure settings for the test-app JVM, uses the daemon by default
test: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
// configure settings for the run-app JVM
run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
// configure settings for the run-war JVM
war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
// configure settings for the Console UI JVM
console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256]
]
grails.project.dependency.resolver = "maven" // or ivy
grails.project.dependency.resolution = {
// inherit Grails' default dependencies
inherits("global") {
// specify dependency exclusions here; for example, uncomment this to disable ehcache:
// excludes 'ehcache'
}
log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
checksums true // Whether to verify checksums on resolve
legacyResolve false // whether to do a secondary resolve on plugin installation, not advised and here for backwards compatibility
repositories {
inherits true // Whether to inherit repository definitions from plugins
grailsPlugins()
grailsHome()
mavenLocal()
grailsCentral()
mavenCentral()
// uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories
//mavenRepo "http://repository.codehaus.org"
mavenRepo "http://download.java.net/maven/2/"
//repo for spring security
mavenRepo "http://repo.spring.io/milestone/"
//mavenRepo "http://repository.jboss.com/maven2/"
}
dependencies {
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
// runtime 'mysql:mysql-connector-java:5.1.29'
runtime 'org.postgresql:postgresql:9.4-1201-jdbc4'
test "org.grails:grails-datastore-test-support:1.0.2-grails-2.4"
}
plugins {
// plugins for the build system only
build ":tomcat:7.0.55.3" // or ":tomcat:8.0.22"
// plugins for the compile step
compile ":scaffolding:2.1.2"
compile ':cache:1.1.8'
// asset-pipeline 2.0+ requires Java 7, use version 1.9.x with Java 6
compile ":asset-pipeline:2.2.3"
compile ":quartz:1.0.2"
compile ":joda-time:1.5"
compile ":XXXXXXX-plugin:0.1-SNAPSHOT"
// plugins needed at runtime but not for compilation
runtime ":hibernate4:4.3.10" // or ":hibernate:3.6.10.18"
runtime ":database-migration:1.4.0"
runtime ":jquery:1.11.1"
// Uncomment these to enable additional asset-pipeline capabilities
//compile ":sass-asset-pipeline:1.9.0"
//compile ":less-asset-pipeline:1.10.0"
//compile ":coffee-asset-pipeline:1.8.0"
//compile ":handlebars-asset-pipeline:1.3.0.3"
}
}
Here is the mapping used in the domain class:
static mapping = {
datasource 'teste'
table 'cd_pt'
id name: 'codPTes'
codPTes column: 'cod_p'
}
Anyone have a clue?
解决方案 Got this working by using the PSQL as primary DB and the H2 as secondary DB.
Still don't know why or if the DataSource had errors in the configuration (I've spent 3 weeks on this, but it's surely possible).
这篇关于多个数据源配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!