Как вы получаете доступ к двум базам данных в 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/ руководство / single.html # multipleDatasources

Grails 2.0 может обрабатывать несколько источников данных без плагина:

Пример с другим источником данных для сред разработки (h2 DataSource) и тестирования (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 упрощает это.

Надеюсь, это поможет, но такой подход может быть применим не ко всем ситуациям.

Следующий пост, по-видимому, является лучшим источником информации по этому вопросу:

Как получить mutli-источник данных в grails

Это сводится к следующему:

  • Определите datasource1 в DevelopmentDataSource
  • Определите datasource2 в resources.xml
  • Напишите DAO для CRUD объектов домена, используя datasource2
  • В поле hibernate.cfg.xml перечислите все объекты домена.

Только первый источник данных будет иметь методы динамического поиска.

Если вам нужен действительно простой запрос, и вы не возражаете против отсутствия функций ORM, вы могли бы использовать Groovy SQL или собственные функции SQL Hibernate.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top