2008-09-03 34 views
20

Grails giúp dễ dàng cấu hình các nguồn dữ liệu cho các môi trường khác nhau (phát triển, thử nghiệm, sản xuất) trong tệp DataSources.groovy của nó, nhưng dường như không có cơ sở để cấu hình nhiều nguồn dữ liệu trong một môi trường . Tôi phải làm gì nếu tôi cần truy cập một số cơ sở dữ liệu từ cùng một ứng dụng Grails?Làm thế nào để bạn truy cập hai cơ sở dữ liệu trong Grails

+0

Tôi biết đây là một bài cũ, nhưng hãy thay đổi câu trả lời chấp nhận @ Sushanth CS vì đó là cách Grails hiện đang hoạt động. –

+0

http://stackoverflow.com/a/36647714/2245264 có câu trả lời cho điều này. –

Trả lời

9

Hiện nay, Grails plugin cho phép sử dụng nhiều datasources trực tiếp với lớp GORM Grails': http://burtbeckwith.com/blog/?p=70

+7

Lưu ý điều này không còn cần thiết như Grails 2.0 (hỗ trợ cho nhiều nguồn dữ liệu được xây dựng trong khung chính) – Peter

-1

Các bài sau đây có vẻ là nguồn thông tin tốt nhất về đề tài này:

How to get mutli-dataSource in grails

Nó nắm tới:

  • Xác định datasource1 trong DevelopmentDataSource
  • Xác định datasource2 tài nguyên .xml
  • Viết DAO cho CRUD của các đối tượng miền sử dụng datasource2
  • Trong hibernate.cfg.xml, liệt kê tất cả các đối tượng miền.

Chỉ nguồn dữ liệu đầu tiên sẽ có phương thức tìm kiếm động.

Nếu đó là một truy vấn thực sự đơn giản mà bạn đang theo dõi và không ngại khi không có các tính năng ORM, bạn có thể sử dụng Groovy SQL hoặc các tính năng SQL gốc của Hibernate.

+1

Đây là lý do tại sao liên kết đến câu trả lời là một ý tưởng tồi. –

1

Bạn có thực sự muốn làm điều này? Theo kinh nghiệm của tôi, kịch bản thông thường ở đây là:

  1. Đơn quản lý dữ liệu riêng của mình trong sơ đồ cơ sở dữ liệu riêng của mình
  2. Thông thường, ứng dụng sẽ yêu cầu dữ liệu từ các nguồn khác (ví dụ, vì vậy dữ liệu tham khảo không được sao chép và dán)

Tôi thường luôn có sự sang trọng của tất cả các lược đồ nằm trên một cá thể cơ sở dữ liệu. Do đó, ứng dụng của tôi:

  • chỉ có kết nối một cơ sở dữ liệu - mà là để schema nó sở hữu và đã đọc/ghi truy cập
  • các ứng dụng khác 'xuất khẩu' dữ liệu của họ thông qua quan điểm
  • ứng dụng của tôi đã đọc tiếp cận với những quan điểm, và có một từ đồng nghĩa với quan điểm cho rằng làm cho nó xuất hiện địa phương

lý do đằng sau sử dụng quan điểm là để cho các ứng dụng được phơi bày dữ liệu

  1. biết rõ ràng rằng nó đang được xuất và những gì đang được xuất khẩu
  2. không hiển thị cấu trúc bên trong của lược đồ (vì vậy nếu cấu trúc bên trong thay đổi, miễn là ứng dụng tiêu thụ không biết)

Tôi chưa thực sự phải làm điều này bằng ứng dụng Grails, nhưng cách tiếp cận này sẽ hoạt động.

Một cách tiếp cận khác để chia sẻ dữ liệu giữa các ứng dụng là tạo một dịch vụ web để hiển thị dữ liệu. Grails làm cho việc này trở nên dễ dàng.

Hy vọng điều đó sẽ hữu ích, nhưng cách tiếp cận này có thể không áp dụng được cho mọi tình huống.

+0

Trong trường hợp bạn vẫn đang xem xét điều này: Sử dụng nhiều hơn một Datasource trong một dự án Grails - http: //www.crjug .org /? q = node/103 – Paul

+3

-1 vì không trả lời được câu hỏi ban đầu, có rất nhiều kịch bản kỹ thuật và thương mại, nơi điều này là cần thiết. –

+0

+1 để đưa ra một điểm tuyệt vời - quản lý nhiều nguồn dữ liệu cực kỳ khó chịu, đặc biệt nếu bạn đã viết mã ứng dụng giả định lớp miền bạn quan tâm đến việc truy cập là một phần của cơ sở dữ liệu cục bộ. Điều này giúp bạn tránh được nỗi đau đầu khi quay lại mã của bạn, loại bỏ các mối quan hệ miền và thiết lập thủ công các lớp liên kết để ánh xạ nhiều liên kết. Một chiến lược hoạt động tốt cho chúng tôi là những gì Paul đề xuất: duy trì một "từ đồng nghĩa" cục bộ, và sau đó kiểm tra các cách khác nhau mà nó có thể không đồng bộ với cơ sở dữ liệu từ xa. – mikermcneil

2

Grails 2.0 có thể xử lý nhiều nguồn dữ liệu mà không cần plugin:

Ví dụ với một nguồn dữ liệu khác nhau cho các dev (h2 dataSource) và thử nghiệm (mysql dataSource_mysql) môi trường:

DataSource .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" 
      } 
     } 
    } 
} 
25

Kết nối khác nhau d cơ sở dữ liệu trong các lớp miền khác nhau rất dễ dàng trong Grails 2.x.x.

ví dụ

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 { 

    } 
} 

Bạn có thể sử dụng bất kỳ datasources trong các lớp miền của bạn bằng cách

class Role{ 
    static mapping = { 
     datasource 'users' 
    } 
} 

class Product{ 
    static mapping = { 
     datasource 'admin' 
    } 
} 

For more details look at this

+2

Đây phải là câu trả lời được chấp nhận –

+1

Kể từ 2.5.x, điều này đã thay đổi. Theo hướng dẫn: http://docs.grails.org/latest/guide/single.html#_multiple_datasources "Nếu có nhiều hơn một' DataSource' trong một ứng dụng thì bây giờ có một 'dataSources {...}' Trước đây, nhiều khai báo dataSource đã được sử dụng, với dấu gạch dưới và hậu tố trên các nguồn dữ liệu bổ sung, ví dụ: 'dataSource_lookup {…}'. – Pere

+0

@Đây không đúng: http: //docs.grails. org/2.5.6/hướng dẫn/đơn.html # multipleDatasources - như bạn thấy ở đó nó vẫn là ký hiệu gạch dưới. Có thể bạn đang đề cập đến grails 3.x.x – codewandler

Các vấn đề liên quan