Grails에서 두 개의 데이터베이스에 어떻게 액세스합니까?

StackOverflow https://stackoverflow.com/questions/41018

  •  09-06-2019
  •  | 
  •  

문제

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"
            }
        }
    }
}

정말로 이 일을 하시겠습니까?내 경험에 따르면 일반적인 시나리오는 다음과 같습니다.

  1. 애플리케이션은 자체 데이터베이스 스키마에서 자체 데이터를 관리합니다.
  2. 애플리케이션에 다른 소스의 데이터가 필요한 경우가 많습니다(예: 참조 데이터가 복사되어 붙여넣어지지 않도록 하기 위해).

저는 일반적으로 항상 하나의 데이터베이스 인스턴스에 있는 모든 스키마를 활용해 왔습니다.따라서 내 신청서는 다음과 같습니다.

  • 하나의 데이터베이스 연결만 가집니다. 이는 자신이 소유한 스키마에 대한 것이며 읽기/쓰기 액세스 권한이 있습니다.
  • 다른 애플리케이션은 뷰를 통해 데이터를 '내보냅니다'
  • 내 애플리케이션에는 해당 뷰에 대한 읽기 액세스 권한이 있으며 해당 뷰에 대한 동의어가 있어 로컬로 표시됩니다.

뷰를 사용하는 이유는 데이터를 노출하는 애플리케이션이

  1. 수출되고 있는 것과 수출되는 것이 무엇인지 명시적으로 알고 있습니다.
  2. 스키마의 내부 구조를 노출하지 않습니다(따라서 내부 구조가 변경되면 보기가 올바른 한 소비 앱은 알 수 없음).

실제로 Grails 애플리케이션으로 이 작업을 수행할 필요는 없었지만 이 접근 방식은 작동할 것입니다.

애플리케이션 간에 데이터를 공유하는 또 다른 접근 방식은 데이터를 노출하는 웹 서비스를 만드는 것입니다.Grails를 사용하면 이를 쉽게 수행할 수 있습니다.

도움이 되기를 바라지만 이 접근 방식이 모든 상황에 적용되는 것은 아닙니다.

다음 게시물이 해당 주제에 대한 가장 좋은 정보 소스인 것 같습니다.

Grails에서 다중 데이터 소스를 얻는 방법

그것은 다음과 같이 요약됩니다:

  • DevelopmentDataSource에서 datasource1 정의
  • resources.xml에 datasource2 정의
  • datasource2를 사용하여 도메인 객체의 CRUD를 위한 DAO 작성
  • hibernate.cfg.xml에서 모든 도메인 객체를 나열합니다.

첫 번째 데이터 소스에만 동적 찾기 메서드가 있습니다.

정말 간단한 쿼리이고 ORM 기능이 없어도 괜찮다면 Groovy SQL이나 Hibernate의 기본 SQL 기능을 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top