【问题标题】:Retrieve Database name from dataSource从数据源中检索数据库名称
【发布时间】:2014-09-11 18:11:43
【问题描述】:

在我的 config.groovy 文件中,我定义了 dataSource.url='jdbc:mysql://localhost/mydbname?autoReconnect=true&characterEncoding=utf8'

是否可以从控制器中检索“mydbname”?我注入了 dataSource,它给出了一个 org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy 但从那里,我不知道如何获取数据库名称。应该在没有任何字符串解析的情况下检索数据库名称,因为用于应用程序的配置可以在环境之间发生很大变化,所以理想情况下我正在寻找像 .getDatasourceName() 之类的方法

我试过这个: flash.message = "DB name ${dataSource.getConnection().getClientInfo()}" 但返回的消息是这样的:DB name [:]

【问题讨论】:

标签: mysql grails datasource


【解决方案1】:

我认为最好的办法是检索 URL,然后解析出数据库名称。你可以这样做:

import org.apache.commons.lang.StringUtils

class MyController {

  DataSource dataSource

  String getDatabaseName() {
    def url = dataSource.targetDataSource.targetDataSource.poolProperties.url

    url = StringUtils.substringAfterLast(url, '/')
    return StringUtils.substringBefore(url, '?')
  }
}

这应该返回数据库名称,而不考虑任何数据源 URL 参数,例如它适用于以下所有情况:

  • jdbc:mysql://localhost/mydbname?autoReconnect=true&characterEncoding=utf8
  • jdbc:mysql://localhost/mydbname?autoReconnect=true
  • jdbc:mysql://localhost/mydbname

【讨论】:

  • 我目前正在使用这个:final sqlQuery = sessionFactory.currentSession.createSQLQuery("SELECT DATABASE()") params.db_name = sqlQuery.uniqueResult() 但我也会测试你的答案。
  • @Giannis 我不认为SELECT DATABASE() 是可移植的,但如果你一直使用 MySQL,我想这没关系
【解决方案2】:

最时髦的方式:

def dataSource
private String getDatabaseName(){
    def url = dataSource.targetDataSource.targetDataSource.poolProperties.url
    return url.split('/').toList().last().tokenize('?')[0]      
}

无论有无 url 参数,它都适用于两种方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多