Использование двух баз данных для приложения в Grails - PullRequest
6 голосов
/ 11 ноября 2010

Я создаю приложение в Grails, которое должно читать из одной базы данных и записывать в другую базу данных.Я создал datasources.groovy для этого требования и установил плагин datasources.Тем не менее, я застрял на том, как использовать этот источник данных при выполнении запроса SQL (выберите * из ........ и т. Д.).

Например.Ниже показано, как я запускаю запрос в своем действии.Я использую настроенные запросы, а не gorm.

РЕДАКТИРОВАНИЕ:

class TuneController {   

    def dataSource_ds2

    def list = {

        String nameSql = "select name from emp where id=3345"
        Sql sql = new Sql(dataSource_ds2)
        String name = sql.rows(nameSql)
        println(name)
    }
}

В приведенном выше случае источники данных не читаются и имеют нулевое значение.Есть ли какой-нибудь пример кода, доступный для этого требования.

Я что-то здесь упускаю?

РЕДАКТИРОВАТЬ:

Моя запись в Datasources.groovy указана ниже.

datasources = { 

    datasource(name:'ds2') {
        domainClasses([com.Tune])
        readOnly(true)
        driverClassName('oracle.jdbc.driver.OracleDriver')
        url('jdbc:oracle:thin:@test-ofr.wellmanage.com:1521:OFRS1')         
        username('test')
        password('test')
        environments(['development'])
        dbCreate('do-not-bother')
        logSql(true)
        dialect(org.hibernate.dialect.Oracle10gDialect)
        hibernate {
            cache {
                use_second_level_cache(false)
                use_query_cache(false)
            }
        }
    }
}

Ответы [ 6 ]

5 голосов
/ 11 ноября 2010

Вторичные источники данных доступны с использованием внедрения зависимостей, но их имена основаны на именах в Datasources.groovy.Например, если вы определили источник данных с именем 'foo', вы бы добавили это с помощью def dataSource_foo:

class MyController {

   def dataSource_foo

   def list = {
      String nameSql = "select name from emp where id=3345"
      Sql sql = new Sql(dataSource_foo)
      def rows = sql.rows(nameSql)
      ...
   }
}

Обратите внимание, что вы должны поместить def dataSource_foo как поле области действия класса, а не внутриваше действие (или метод).Это верно для каждого внедрения зависимости - если оно внутри метода или замыкания, это просто переменная области действия метода.

2 голосов
/ 04 мая 2012

Просто чтобы обновить ответ на этот вопрос (я только что получил новый проект, который требует использования двух разных БД mysql).Мне пришлось обновиться до Grails 2.0 (да, я слишком лениво обновлялся с версии 1.3.7), так как он имеет встроенную поддержку нескольких источников данных (не нужно использовать плагин).

Grails2.0 - несколько источников данных

В этом примере вам нужно только установить базы данных в файле DataSource.groovy

environments {
development {
    dataSource {
        dbCreate = "create-drop"
        url = "jdbc:h2:mem:devDb"
    }
    dataSource_lookup {
        dialect = org.hibernate.dialect.MySQLInnoDBDialect
        driverClassName = 'com.mysql.jdbc.Driver'
        username = 'lookup'
        password = 'secret'
        url = 'jdbc:mysql://localhost/lookup'
        dbCreate = 'update'
    }
}

Затем в классе домена указать, какой источник данных:

class ZipCode {

    String code

    static mapping = { datasource 'lookup' } 
 }
0 голосов
/ 18 апреля 2016

Интересно, почему никто не упомянул здесь плагин c3p0: c3p0: 0.9.1.2.

Это лучшая практика для реализации нескольких баз данных в приложении Grails

Buildconfig.groovy

compile 'c3p0:c3p0:0.9.1.2'

источник данных

 dataSource {
            dialect = 'com.example.hibernateutil.MySQL5InnoDBDialectBitFixed'
            dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
            driverClassName = "com.mysql.jdbc.Driver"
            url = "jdbc:mysql://127.0.0.1/demo
            username = "root"
            password = ""
        }

        dataSource_Demo {
            dialect = 'com.example.hibernateutil.MySQL5InnoDBDialectBitFixed'
            dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
            driverClassName = "com.mysql.jdbc.Driver"
            url = "jdbc:mysql://127.0.0.1/demo2"
            username = "root"
            password = ""
        }

resources.groovy

beans = {


   dataSource_Demo(ComboPooledDataSource) { bean ->
        bean.destroyMethod = 'close'
        //use grails' datasource configuration for connection user, password, driver and JDBC url
        user = grailsApplication.config.dataSource_Demo.username
        password = grailsApplication.config.dataSource_Demo.password
        driverClass = grailsApplication.config.dataSource_Demo.driverClassName
        jdbcUrl = grailsApplication.config.dataSource_Demo.url
        idleConnectionTestPeriod = 2 * 60 * 60 //2 hours
        testConnectionOnCheckin = true
    }

    /**
     * c3P0 pooled data source that allows 'DB keepalive' queries
     * to prevent stale/closed DB connections
     * Still using the JDBC configuration settings from DataSource.groovy
     * to have easy environment specific setup available
     */
    dataSource(ComboPooledDataSource) { bean ->
        bean.destroyMethod = 'close'
        //use grails' datasource configuration for connection user, password, driver and JDBC url
        user = grailsApplication.config.dataSource.username
        password = grailsApplication.config.dataSource.password
        driverClass = grailsApplication.config.dataSource.driverClassName
        jdbcUrl = grailsApplication.config.dataSource.url
        idleConnectionTestPeriod = 2 * 60 * 60 //2 hours
        testConnectionOnCheckin = true
    }
}
0 голосов
/ 15 апреля 2016

Пример использования нескольких источников данных в Grails Services с SQL.

Подсказка: вы можете использовать TestServiceWithInjection или TestService.Оба отлично работают.

DataSource.groovy

dataSource {
    pooled = true
    jmxExport = true
    driverClassName = "com.mysql.jdbc.Driver"
    dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
//    cache.region.factory_class = 'org.hibernate.cache.SingletonEhCacheRegionFactory' // Hibernate 3
    cache.region.factory_class = 'org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory' // Hibernate 4
    singleSession = true // configure OSIV singleSession mode
    flush.mode = 'manual' // OSIV session flush mode outside of transactional context
}

// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:mysql://localhost:3306/database1"
            username = "root"
            password = "password"
        }
        dataSource_second {
            driverClassName = "com.mysql.jdbc.Driver"
            dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
            dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:mysql://localhost:3306/database2"
            username = "root"
            password = "password"
        }
    }
    test {
        dataSource {
            //Used by local test run (grails test-app)
            dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:mysql://test-server.com:3306/test_ci"
            username = "root"
            password = "password"
        }
    }
}

TestServiceWithInjection.groovy

package com.github.biniama

import grails.transaction.Transactional
import groovy.sql.Sql

import javax.annotation.PostConstruct

@Transactional
class TestService {

    def dataSource_second

    Sql sql

    @PostConstruct
    def initSql() {
        sql = new Sql(dataSource_second)
    }

    def getData() {
        def q = "SELECT id FROM job LIMIT 1"
        return sql.rows(q)
    }
}

TestService.groovy

package com.github.biniama

import grails.transaction.Transactional
import groovy.sql.Sql

@Transactional
class TestService {

private Sql sql

void setDataSource_second(def dataSource) {
    sql = new Sql(dataSource)
}

Integer getData() {
    def q = "SELECT id FROM job LIMIT 1"
    return sql.rows(q)
}

} ​​

TestController.groovy

package com.github.biniama

class TestController {

  TestService testService

  def index() {
    Integer result = testService.getData()
    render "Returned value is ${result}"
  }
}
0 голосов
/ 12 ноября 2010

Я обновил свой источник данных до следующего, и это сработало.Я не уверен, однако, в чем причина этого.

 datasources = {  

    datasource(name:'ds2') { 
        domainClasses([com.Tune]) 
        readOnly(true) 
        driverClassName('oracle.jdbc.driver.OracleDriver') 
        url('jdbc:oracle:thin:@test-ofr.tnic.com:1521:OFRS1')          
        username('test') 
        password('test') 
        environments(['development']) 
        dbCreate('do-not-bother') 
        logSql(true) 
        dialect(org.hibernate.dialect.Oracle10gDialect) 
        hibernate { 
            cache { 
               provider_class('net.sf.ehcache.hibernate.EhCacheProvider')
               use_second_level_cache(true)
               use_query_cache(true)
            } 
        } 
    } 
} 
0 голосов
/ 11 ноября 2010

Я сделал это в BootStrap последнего проекта, над которым я работал. Просто помните, что действительный Java-код также допустим в Groovy (в основном), и вам не нужно делать все «Grails Way». Просто подключитесь к базе данных «from» так, как вам удобно, и сохраняйте данные в источнике данных Grails с помощью манипуляций с объектами Grails. Пример кода:

try {
    Connection con = DriverManager.getConnection ("jdbc:xxxx", "username", "password")
    ResultSet resultSet = con.createStatement().executeQuery("SELECT * FROM the_table")
    while(resultSet.next()) {
        DomainObject domainObjectInstance = new DomainObject(attributeA: resultSet.getString('attributeA'), attributeB: resultSet.getString('attributeB'))
        if (!domainObjectInstance.save(flush: true)) {
            println "Unable to save DomainObject: ${domainObjectInstance.errors}"
        }
    }
} catch (SQLException e) {
    e.printStackTrace();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...