Недавно я захотел использовать ту же базу данных Postgres, но разделил свой уровень персистентности на отдельные компоненты, которые использовали разные схемы. Мотивация состояла в том, чтобы продвинуть модульный дизайн, разделить проблемы и прекратить перепутывать разработчиков. Вертикальные доменные модели могут быть труднодостижимыми, но не невозможными.
В моем приложении для покупок у меня был пользовательский компонент, торговый компонент и компонент продукта. Теперь это довольно легко, если вы используете отдельные базы данных, но иногда приятно просто разделить задачи, используя отдельные схемы в одной и той же базе данных, поскольку использование одной и той же базы данных может упростить такие вещи, как DR, доставка журналов, репликация и т. Д.
В то время как я мог найти документ для отдельных баз данных, мне было трудно найти документ Grails для совета по моей конкретной проблеме — как использовать отдельные схемы при использовании той же базы данных при использовании Postgres . Вот как я это сделал.
Вот мой источник данных.гроовый.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
String db_url = "jdbc:postgresql://localhost:5432/testdb" String usernameVar = "db_user" String passwordVar = "db_secret" String dbCreateVar = "update" String dialect = "net.kaleidos.hibernate.PostgresqlExtensionsDialect" dataSource_user { pooled = true jmxExport = true dialect = dialect driverClassName = "org.postgresql.Driver" username = usernameVar password = passwordVar url = platform_url dbCreate= "validate" } hibernate_user { cache.use_second_level_cache = false cache.use_query_cache = false cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3 singleSession = true // configure OSIV singleSession mode default_schema = "user" } dataSource_shopping { pooled = true jmxExport = true dialect = dialect driverClassName = "org.postgresql.Driver" username = usernameVar password = passwordVar url = platform_url dbCreate = "validate" } hibernate_shopping { cache.use_second_level_cache = false cache.use_query_cache = false cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3 singleSession = true // configure OSIV singleSession mode default_schema = "shopping" } dataSource_product { pooled = true jmxExport = true dialect = dialect driverClassName = "org.postgresql.Driver" username = usernameVar password = passwordVar url = platform_url dbCreate= "validate" } hibernate_product { cache.use_second_level_cache = false cache.use_query_cache = false cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3 singleSession = true // configure OSIV singleSession mode default_schema = "product" } |
Примечание: в конфиге есть несколько очевидных оптимизаций, но приведенное выше просто упрощает объяснение.
Затем я сопоставил каждый объект GORM с соответствующей схемой.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class Cart { // ... // ... static mapping = { datasource 'shopping' // ... } } class Address { // ... // ... static mapping = { datasource 'user' } } class Stock { // ... // ... static mapping = { datasource 'product' } } |
Затем я запустил свое приложение и сказал: «Да, это работает», немного перекусил и перешел к следующей проблеме. Как видно, хитрость заключается в том, чтобы использовать отдельное закрытие гибернации, указать там схему и назвать закрытие, используя тот же формат именования для отдельной базы данных, но сделать так, чтобы закрытия базы данных указывали на одну и ту же базу данных.
Ссылка: | Использование отдельных схем Postgres для той же базы данных в приложении Grails от нашего партнера по JCG Алекса Стейвли в блоге Techlin в Дублине . |