문제
Grails를 사용하면 DataSources.groovy 파일에서 다양한 환경(개발, 테스트, 프로덕션)에 대한 데이터 소스를 매우 쉽게 구성할 수 있지만, 하나의 환경에서 여러 데이터 소스를 구성할 수 있는 기능은 없는 것 같습니다.동일한 Grails 애플리케이션에서 여러 데이터베이스에 액세스해야 하는 경우 어떻게 해야 합니까?
해결책 3
이제 Grails의 GORM 계층에서 직접 여러 데이터 소스를 사용할 수 있는 Grails 플러그인이 있습니다.http://burtbeckwith.com/blog/?p=70
다른 팁
Grails 2.x.x에서는 다양한 도메인 클래스의 다양한 데이터베이스를 연결하는 것이 매우 쉽습니다.
예를 들어
development {
dataSource {//DEFAULT data source
.
.
}
dataSource_admin { //Convention is dataSource_name
url = "//db url"
driverClassName = "oracle.jdbc.driver.OracleDriver"
username = "test"
password = 'test123'
}
dataSource_users {
}
}
다음을 수행하여 도메인 클래스의 모든 데이터 소스를 사용할 수 있습니다.
class Role{
static mapping = {
datasource 'users'
}
}
class Product{
static mapping = {
datasource 'admin'
}
}
Grails 2.0 이상을 사용하는 경우 플러그인이 필요하지 않으며 기본적으로 지원됩니다.
http://www.grails.org/doc/latest/guide/single.html#multipleDatasources
Grails 2.0은 플러그인 없이 여러 데이터 소스를 처리할 수 있습니다.
dev(h2 dataSource) 및 test(mysql dataSource_mysql) 환경에 대한 다른 데이터 소스의 예:
데이터소스.groovy:
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
dataSource_mysql {
dialect = org.hibernate.dialect.MySQLInnoDBDialect
driverClassName = 'com.mysql.jdbc.Driver'
username = "user"
password = "pass"
url = "jdbc:mysql://mysqldb.com/DBNAME"
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
configClass = HibernateFilterDomainConfiguration.class
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:file:../devDb;MVCC=TRUE"
sqlLogging = true
}
}
test {
dataSource_mysql {
configClass = HibernateFilterDomainConfiguration.class
dbCreate = "create" // one of 'create', 'create-drop', 'update', 'validate', ''
sqlLogging = true
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}
정말로 이 일을 하시겠습니까?내 경험에 따르면 일반적인 시나리오는 다음과 같습니다.
- 애플리케이션은 자체 데이터베이스 스키마에서 자체 데이터를 관리합니다.
- 애플리케이션에 다른 소스의 데이터가 필요한 경우가 많습니다(예: 참조 데이터가 복사되어 붙여넣어지지 않도록 하기 위해).
저는 일반적으로 항상 하나의 데이터베이스 인스턴스에 있는 모든 스키마를 활용해 왔습니다.따라서 내 신청서는 다음과 같습니다.
- 하나의 데이터베이스 연결만 가집니다. 이는 자신이 소유한 스키마에 대한 것이며 읽기/쓰기 액세스 권한이 있습니다.
- 다른 애플리케이션은 뷰를 통해 데이터를 '내보냅니다'
- 내 애플리케이션에는 해당 뷰에 대한 읽기 액세스 권한이 있으며 해당 뷰에 대한 동의어가 있어 로컬로 표시됩니다.
뷰를 사용하는 이유는 데이터를 노출하는 애플리케이션이
- 수출되고 있는 것과 수출되는 것이 무엇인지 명시적으로 알고 있습니다.
- 스키마의 내부 구조를 노출하지 않습니다(따라서 내부 구조가 변경되면 보기가 올바른 한 소비 앱은 알 수 없음).
실제로 Grails 애플리케이션으로 이 작업을 수행할 필요는 없었지만 이 접근 방식은 작동할 것입니다.
애플리케이션 간에 데이터를 공유하는 또 다른 접근 방식은 데이터를 노출하는 웹 서비스를 만드는 것입니다.Grails를 사용하면 이를 쉽게 수행할 수 있습니다.
도움이 되기를 바라지만 이 접근 방식이 모든 상황에 적용되는 것은 아닙니다.
다음 게시물이 해당 주제에 대한 가장 좋은 정보 소스인 것 같습니다.
그것은 다음과 같이 요약됩니다:
- DevelopmentDataSource에서 datasource1 정의
- resources.xml에 datasource2 정의
- datasource2를 사용하여 도메인 객체의 CRUD를 위한 DAO 작성
- hibernate.cfg.xml에서 모든 도메인 객체를 나열합니다.
첫 번째 데이터 소스에만 동적 찾기 메서드가 있습니다.
정말 간단한 쿼리이고 ORM 기능이 없어도 괜찮다면 Groovy SQL이나 Hibernate의 기본 SQL 기능을 사용할 수 있습니다.