Статьи

Использование нескольких источников данных в проекте Grails: плагин Datasources


Grails поддерживает только один источник данных и один SessionFactory, и все классы используют их, что может вызвать некоторые проблемы, когда вам нужно работать с несколькими базами данных в одном проекте. Эту проблему можно решить благодаря
Бёрту Беквиту , который разработал
плагин Datasources, который позволяет вам настраивать несколько источников данных в одном проекте Grails, позволяя вам определять набор классов для использования одного источника данных, а другой набор для использования другого источника данных, например. В этой статье будут рассмотрены некоторые преимущества, проблемы, а также некоторые советы и рекомендации, которые могут помочь вам извлечь максимальную пользу из этого подключаемого модуля.

Преимущества

Использование подключаемого модуля источников данных дает множество преимуществ:

  • Вы можете подключиться к нескольким базам данных и использовать GORM для управления данными через классы домена, что дает вам всю гибкость и простоту использования, которые предлагает GORM.
  • Вы можете настроить свои источники данных только для чтения.
  • Вы можете настроить конфигурацию источников данных для каждой среды, что обеспечивает большую гибкость.
  • Источники данных, создаваемые плагином, являются обычными компонентами Spring, что позволяет вам при необходимости переопределять их свойства.
  • Вы можете указать пользовательскую конфигурацию Hibernate для каждого источника данных, поместив файл конфигурации Hibernate в путь к классам.

вопросы

  • В Grails вы можете настроить различные параметры для вашего приложения и вашего основного источника данных во внешнем файле конфигурации, и Grails перезапишет эти параметры во время запуска. Это очень полезно, когда вам нужно запустить один и тот же WAR-файл на разных серверах, которые требуют разной конфигурации. Тем не менее, не существует простого способа перенести конфигурацию для подключаемого модуля Datasources, так как подключаемый модуль не перезаписывает конфигурацию Datasources, если существует внешний файл конфигурации.
  • Вы не можете указать конфигурационное местоположение для пользовательского файла конфигурации Hibernate, поэтому для того, чтобы плагин Datasources подобрал его, вам нужно поместить файл конфигурации в classpath и с определенным именем, что-то вроде [datasource_name.hibernate.cfg.xml] иначе он не будет поднят. Это проблематично, потому что если вы хотите использовать настраиваемый файл конфигурации для Hibernate, который отличается для каждой среды (dev, test, prod), вы не сможете легко это сделать, поскольку в конфигурации источника данных нет способа указать расположение конфигурации, как вы бы это сделали сделать в файле конфигурации источника данных, используемого Grails по умолчанию.
  • Есть другие проблемы, упомянутые на странице плагина, которые я не собираюсь повторять здесь.

Советы и рекомендации

Внешняя конфигурация источников данных

Как уже упоминалось ранее, конфигурацию проекта можно вывести наружу, чтобы вы могли отделить свою конфигурацию от файла WAR проекта, однако эта функциональность не включена в состав подключаемого модуля источников данных, поэтому вот совет о том, как настроить конфигурацию каждого другого источника данных, который у вас есть. (Вы можете найти больше информации о том, как внешняя конфигурация работает в
документации Grails ).

Для этого вам нужно перезаписать настройки bean-компонента источника данных в файле ресурсов Spring, например, допустим, у вас есть следующая конфигурация в вашем Datasources.groovy файл:

datasources = {
datasource(name: 'testDbReadOnly') {
domainClasses([com.test.Person,
com.test.Company,
com.test.Deparment
])
driverClassName('org.postgresql.Driver')
readOnly(true)
url('jdbc:postgresql://[server-name]:5432/test')
pooled(true)
username('test')
password('test')
logSql(false)
dialect(org.hibernate.dialect.PostgreSQLDialect)

hibernate {
cache {
use_query_cache(true)
use_second_level_cache(true)
provider_class('net.sf.ehcache.hibernate.EhCacheProvider')
}
}
}
}

Тогда в вашем весеннем файле ресурсов вам понадобится что-то вроде этого:

 dataSource_testDbReadOnly(BasicDataSource) {bean ->
bean.destroyMethod = 'close'
username = GrailsConfig.get("testDbReadOnly.datasource.username", "sa")
password = GrailsConfig.get("testDbReadOnly.datasource.password", "")
driverClassName = GrailsConfig.get("testDbReadOnly.datasource.driver.name", "org.hsqldb.jdbcDriver")
url = GrailsConfig.get("testDbReadOnly.datasource.url", "jdbc:h2:mem:testDb")
maxWait = -1
minEvictableIdleTimeMillis = (1000 * 60 * 5) // 5 min
timeBetweenEvictionRunsMillis = (1000 * 60 * 5) // 5 min
numTestsPerEvictionRun = 3
testOnBorrow = true
testWhileIdle = false
testOnReturn = false
validationQuery = "SELECT 1"
}

Как видите, вам нужно указать имя компонента как dataSource_nameOfYourDataSource, в нашем примере это будет dataSource_testDbReadOnly.

Здесь мы изменяем свойства bean-компонента Datasource и устанавливаем их на основе значений, определенных в файле Config.groovy, значения которых будут определяться по-разному в зависимости от среды, в которой мы работаем. Так например в нашем Config.groovy у нас будет:

environments {
production {
testDbReadOnly {
datasource {
driver.name = 'org.postgresql.Driver'
url = 'jdbc:postgresql://[production-server]:5432/[production-db]'
username = '[production-username]'
password = '[production-password]'
}
}
}
development {
testDbReadOnly {
datasource {
driver.name = 'org.postgresql.Driver'
url = 'jdbc:postgresql://[dev-server]:5432/[dev-db]'
username = '[dev-username]'
password = '[dev-password]'
}
}
}
test {
testDbReadOnly {
datasource {
driver.name = 'org.postgresql.Driver'
url = 'jdbc:postgresql://[test-server]:5432/[test-db]'
username = '[test-username]'
password = '[test-password]'
}
}
}
}

Вы, вероятно, думаете, что вы уже можете сделать это в файле Datasources.groovy, указав конфигурацию в разных средах. Однако, поскольку конфигурация источника данных теперь зависит от конфигурации, определенной в файле Config.groovy, вы можете перезаписать эти настройки во внешних файлах конфигурации, что дает нам то, что нам нужно, перенести конфигурацию источников данных во внешний файл.

Вам необходимо добавить свойства источника данных в ваш внешний файл конфигурации следующим образом:

testDbReadOnly.datasource.driver.name=org.postgresql.Driver
testDbReadOnly.datasource.url=jdbc:postgresql://test.production.server:5432/testDb
testDbReadOnly.datasource.username=test
testDbReadOnly.datasource.password=test

Например, если вам нужно развернуть один и тот же файл WAR на разных серверах, вы можете иметь файлы внешних свойств с различным набором настроек на каждом из этих серверов без необходимости создавать разные WAR для каждого.

Как уже говорилось, у плагинов Datasources есть некоторые проблемы, но ни один из них не является тем, к которому вы не можете найти обходной путь. Он предлагает большие преимущества и очень прост в использовании. Надеемся, что однажды он будет интегрирован в ядро ​​Grails, так что вы сможете управлять различными источниками данных, не устанавливая плагин для этого. От: http://maricel-tech.blogspot.com/2011/01/using-multiple-datasources-in-grails.html