Grails:在运行时配置数据源

时间:2015-01-02 18:50:30

标签: grails database-connection datasource

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

2 个答案:

答案 0 :(得分:0)

在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 {
        ...
    }
}

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

答案 1 :(得分:0)

由于您说用户应该能够通过Web界面配置数据源,因此您应该询问配置参数,因为maxActive,maxIdle等...一旦您拥有所有参数,您可以存储在任何您想要的位置。

在Grails应用程序中:

// grails-app/conf/BootStrap.groovy

import utils.DataSourceConfigurator

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

就像你对你的应用程序说的那样,一旦准备好运行它就需要先配置DataSource。

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