Как загрузить конфигурацию источника данных из внешнего файла в Grails 3.1.8?

Я пишу приложение Grails 3.1.8. Мой источник данных написан в файле application.groovy.

Я хочу загрузить конфигурацию источника данных, такую ​​как имя пользователя, пароль, БД из внешнего файла. Есть ли способ сделать это в Grails 3+ версии.

Вот моя конфигурация источника данных в application.groovy:-

hibernate {
    cache {
        queries = false
        use_second_level_cache = true
        use_query_cache = false
        region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory'
    }
}

dataSource {
    pooled = true
    jmxExport = true
    dialect = 'org.hibernate.dialect.PostgreSQLDialect'
    driverClassName = 'org.postgresql.Driver'
    username = 'postgres'
    password = 'postgres'
    properties = {
        jmxEnabled = true
        initialSize = 5
        maxActive = 50
        minIdle = 5
        maxIdle = 25
        maxWait = 10000
        maxAge = 10 * 60000
        timeBetweenEvictionRunsMillis = 5000
        minEvictableIdleTimeMillis = 60000
        validationQuery = "SELECT 1"
        validationQueryTimeout = 3
        validationInterval = 15000
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        ignoreExceptionOnPreLoad = true
        jdbcInterceptors = "ConnectionState;StatementCache(max=200)"
        defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED // safe default
        abandonWhenPercentageFull = 100 // settings are active only when pool is full
        removeAbandonedTimeout = 120
        removeAbandoned = true
        logAbandoned = false // causes stacktrace recording overhead, use only for debugging
    }
}

environments {
    development {
        dataSource {
            dbCreate = 'update'
            url = "jdbc:postgresql://localhost:5432/testdb"
            logSql = true
        }
    }
    test {
        dataSource {
            dbCreate = 'update'
            url = "jdbc:postgresql://localhost:5432/testdb"
            logSql = true
        }
    }
    production {
        dataSource {
            dbCreate = 'update'
            url = "jdbc:postgresql://localhost:5432/testdb"
            logSql = true
        }
    }
}

4 ответа

Решение

Вот решение, которое сработало для меня, вы можете попробовать.

Это решение будет работать для Grails 3.0+

Прежде всего необходимо добавить следующую зависимость:

скомпилируйте 'org.grails.plugins:external-config:1.1.2'

Затем необходимо создать внешний файл конфигурации groovy, например:

дб-Config.groovy

затем нужно поместить этот файл конфигурации за пределы каталога приложения или библиотеки Tomcat. например:

D: \ Apache-8.0.47-кот \ Lib

Затем нужно прочитать конфигурационный файл из application.groovy. В application.groovy необходимо разместить следующую строку кода для каждой среды:

grails.config.locations = ['file: /// ${catalina.home} /lib/db-config.groovy']

или же

grails.config.locations = ['file:///D:/apache-tomcat-8.0.47/lib/db-config.groovy']

Вы можете использовать ${catalina.home}, если в вашей системе установлена ​​переменная окружения CATALINA_HOME. Кроме того, вы должны использовать прямой путь, который я показал.

Так что ваше application.groovy будет следующим:

> environments {
>      development {
>          grails.config.locations = ['file:///${catalina.home}/lib/db-config.groovy']
>      }
>      production {
>           grails.config.locations = ['file:///${catalina.home}/lib/db-config.groovy']
>           ]
>      }
> }

и ваш файл db-config.groovy будет содержать следующие строки:

>     dataSource {
>       username = <DB_USER_NAME>
>       password = <DB_PASSWORD>
>       dbCreate = 'update'
>       url = <DB_URL>
>       logSql = true
>     }

Вы можете использовать разные файлы db-config.groovy для каждой среды.

Вы можете загрузить свой внешний файл конфигурации из файловой системы, используя следующую реализацию.

Этот пример определяет для каждой среды (разработка / производство / тестирование) отдельный путь к внешнему файлу конфигурации.

 environments {
     development {
          grails.config.locations = [
                "file:///home/<CONFIG_FILE_LOCATION_DIR>/myconfig_developement.groovy" //for Unix based systems
          ]
     }
     production {
          grails.config.locations = [
                "file:///home/<CONFIG_FILE_LOCATION_DIR>/myconfig_production.groovy" // for Unix based systems
          ]
     }
}

Поместите конфигурацию вашей базы данных в myconfig_developement.groovy следующее:

dataSource {
    dbCreate = 'update'
    url = "jdbc:postgresql://localhost:5432/testdb"
    logSql = true
}

Вы можете использовать это решение (это работало для меня, с Grails 3.1.x)

Grails-приложение / INIT /Application.groovy:

class Application extends GrailsAutoConfiguration implements EnvironmentAware {
    static void main(String[] args) {
        GrailsApp.run(Application, args)
    }

    @Override
    void setEnvironment(Environment environment) {
        def path = "/etc/grails-app-config.properties"
        def file = new File(path)

        if(file.exists()) {
            def config = new ConfigSlurper().parse(file.text)
            environment.propertySources.addFirst(new MapPropertySource(grails.util.Environment.getCurrent().name, config))
        }
    }
}

Вы можете использовать переменную окружения для пути конфигурации:

System.getenv(ENV_CONF_FILE_VAR)

grails-app-config.properties:

dataSource.dbCreate='update'
dataSource.driverClassName='com.mysql.jdbc.Driver'
dataSource.url='jdbc:mysql://localhost:5432/testdb'
dataSource.username='user'
dataSource.password='pass'
com.test='test'
com.numTest=4

Вы можете использовать плагин Grails external-config и определить конфигурацию в вашем внешнем файле конфигурации.

grails.config.locations = [
        "file:///etc/app/myconfig.groovy"
]

А затем определить конфигурацию источника данных в myconfig.groovy

Я использую grails 3.3.11, и вот что я сделал для загрузки моей конфигурации БД из внешнего файла / источника:


application.yaml:

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

dataSource:
  pooled: true
  driverClassName: "com.microsoft.sqlserver.jdbc.SQLServerDriver"
  url:
  username:
  password:
  loggingSql: true

Теперь есть два способа запустить приложение:

  1. bootRun (конфигурация ниже)
  2. Запускаемая jar или война, java -jar --spring.config.location=file:external.properties

bootRun (build.gradle)

def Properties localBootRunProperties() {
    Properties p = new Properties()
    p.load(new FileInputStream("path to external.properties"))
    return p
}
bootRun {
    doFirst {
        bootRun.systemProperties = localBootRunProperties()
    }
    ...
}

Теперь файл external.properties должен иметь точно такую ​​же конфигурацию для переопределения значений application.yaml.

dataSource.url=
dataSource.username=
dataSource.password=

Вот и все. Наслаждаться.

Другие вопросы по тегам