【问题标题】:Grails : Configuring data source at runtimeGrails:在运行时配置数据源
【发布时间】:2015-03-01 01:46:08
【问题描述】:

我正在开发一个小型 grails 应用程序。我想为应用程序创建一个安装向导,让用户能够通过 Web 界面配置数据连接设置。有没有办法在应用程序运行时停止数据连接并配置数据源?我想这样做,同时保持对所有域对象利用 GORM/Hibernate 的能力。配置数据源后重新启动/重新加载应用程序就可以了。

【问题讨论】:

  • 查看this plugin
  • 我想在配置数据源后利用 GORM/Hibernate。我认为这不适用于我的场景。
  • 如果您决定采用下面 Aram 的建议 --- 外部配置可以通过类似这样的方式即时重新加载 -- def locations = config.grails.config.locations locations.each { String configFileName = it.split("file:")[1] config.merge(new ConfigSlurper().parse(new File(configFileName).text)) }

标签: grails database-connection datasource


【解决方案1】:

既然您说用户应该能够通过 Web 界面配置数据源,那么您应该询问配置参数,因为 maxActive、maxIdle 等......一旦您拥有了所有您想要存储的参数。

在您的 Grails 应用程序中:

// grails-app/conf/BootStrap.groovy

import utils.DataSourceConfigurator

class BootStrap {
    def init = { servletContext ->
        DataSourceConfigurator.configure(servletContext)
    }
}

像这样你对你的应用程序说,一旦它准备好运行,它需要首先配置数据源。

package utils

import org.codehaus.groovy.grails.commons.ApplicationAttributes
import org.codehaus.groovy.grails.web.json.JSONObject

class DataSourceConfigurator {

    private static JSONObject getDSConfig() {
        JSONObject conf = new JSONObject()
        // Go find the configuration wherever you stored it from the web interface, parse it and return it.
        return conf
    }

    public static final configure = { servletContext ->
        if(!servletContext) {
            // Invalid servlet context
            return
        }

        def context = servletContext.getAttribute(ApplicationAttributes.APPLICATION_CONTEXT)
        def ds = context?.dataSourceUnproxied
        if(!ds) {
            // There is no datasource available to configure.
            return
        }

        JSONObject config = getDSConfig()
        if(!config) {
            // No previous configuration saved from web interface.
            return
        }

        ds.setInitialSize(config.initialSize)
        ds.setMaxWait(config.maxWait)
        ds.setMaxActive(config.maxActive)
        ds.setMinIdle(config.minIdle)
        ds.setMaxIdle(config.maxIdle)
        ....
        // There are many other variables to configure. Check them by yourself.
    }
}

有关更多信息,您可以查看有关 DataSource 配置的文档:http://docs.grails.org/latest/guide/conf.html#transactionAwareDataSourceProxy

【讨论】:

    【解决方案2】:

    在 Config.groovy 文件中为 grails.config.locations 的值再添加 1 个条目

    结果你会得到这样的东西

    grails.config.locations = ["file:${userHome}/.grails/global-config.groovy",
                               "classpath:${appName}-config.properties",
                               "classpath:${appName}-config.groovy",
                               "file:${userHome}/.grails/${appName}-config.properties",
                               "file:${userHome}/.grails/${appName}-config.groovy",
                               "file:${userHome}/.grails/${appName}-MyDbconfig.groovy"]
    

    在用户输入数据库连接参数后在您的应用程序中将其写入文件

    "file:${userHome}/.grails/${appName}-MyDbconfig.groovy" 
    

    以相应的格式。喜欢下面的

    dataSource{
        url = '...'
        username = '...'
        password = '...'
    
        properties {
            ...
        }
    }
    

    保存文件并重新启动应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2011-09-11
      • 2014-04-02
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多