当前位置: 首页 > 面试题库 >

Grails:创建动态SQL连接

郭云
2023-03-14
问题内容

对于我的应用程序,我需要在运行时进行动态数据库连接。我知道,有多种方法可以创建多个数据源,但我认为它们并不是那么动态。设想:

用户可以输入数据库凭据并连接到远程数据库,以将单个行和表导入另一个数据库。为此,我需要动态连接到远程数据库。

我试图在服务中做到这一点,就像他们在“如果在grails中使用groovy
sql类”中
所说的那样,它是否使用grails连接池

注意:在这种情况下,GORM是可有可无的,我可以改用普通SQL。

有任何想法吗?谢谢..

编辑:Grails 2.3.4


问题答案:

您可以执行以下操作在运行时注册DataSource bean:

给予Grails服务:

package whatever

import groovy.sql.Sql
import org.springframework.context.*
import org.apache.tomcat.jdbc.pool.DataSource
import org.springframework.context.support.GenericApplicationContext

class DataSourceService implements ApplicationContextAware {

    ApplicationContext  applicationContext

    def registerBean( String beanName, String dsurl, String uid, String pwd ) {
        if( !applicationContext.containsBean( beanName ) ) {
            def bb = new grails.spring.BeanBuilder()
            bb.beans {
                "$beanName"( DataSource ) {
                    driverClassName = "com.mysql.jdbc.Driver"
                    url             = dsurl
                    username        = uid
                    password        = pwd
                    validationQuery = "SELECT 1"
                    testOnBorrow    = true
                    maxActive       = 1
                    maxIdle         = 1
                    minIdle         = 1
                    initialSize     = 1
                }
            }
            bb.registerBeans( applicationContext )
            log.info "Added $beanName"
        }
        else {
            log.error "Already got a bean called $beanName"
        }
    }

    def deRegisterBean( String beanName ) {
        if( applicationContext.containsBean( beanName ) ) {
            (applicationContext as GenericApplicationContext).removeBeanDefinition( beanName )
            log.info "Removed $beanName"
        }
        else {
            log.error "Trying to deRegister a bean $beanName that I don't know about"
        }
    }

    def getSql( String beanName ) {
        Sql.newInstance( applicationContext.getBean( beanName ) )
    }
}

然后,您应该能够调用该服务以注册新的数据源:

dataSourceService.registerBean( 'myDS', 'jdbc:mysql://localhost:3306/mysql', 'test', 'test' )

为此获取一个Groovy Sql对象:

dataSourceService.getSql( 'myDS' ).rows( 'SELECT * FROM whatever' )

并在完成后删除豆

dataSourceService.deRegisterBean( 'myDS' )

手指交叉…我已经从我的项目中删除了该代码,并更改/未对其进行测试;-)

更新

已经创建了runtime-datasources插件,该插件使用本文中概述的方法来允许在运行时添加/删除数据源。



 类似资料:
  • 在一些情况下,必须使用动态连接库: 1.多个应用程序共享代码和数据:比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。 2.在钩子程序过滤系统消息时必须使用动态连接库 3.设备驱动程序必须是动态连接库 4.如果要在对话框编辑器中使用自己定义的控件,也必须使用动态连接库 5.动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与

  • 问题内容: 我有以下查询,该查询返回,商店编号及其区域以及2016年商店销售额的总和。 我将如何添加第四列,以总结每个商店所在区域的销售额。 每个区域有许多存储,因此,在相同区域中具有存储的每个ROW上,该值将相同。 希望我能解释清楚吗? 问题答案: 您可以使用窗口功能:

  • 问题内容: 我需要创建一个动态查询,其中条件将根据传入的请求更改,其中请求将始终通过查询参数获取。例子如下: http:// localhost:8084 / basePath?name = balwant&age = 26 ,或 http:// localhost:8084 / basePath?name = balwant&age = 26&gender = M 同样,它是动态的。现在,我需要

  • 我正在开发Grails应用程序,目标是Grails Mongo插件。当我使用run-app命令在本地运行应用程序时,一切正常,应用程序打开了2个到Mongo实例的连接。 但是当我将应用程序打包到war文件并将其部署到远程Tomcat服务器时,启动应用程序的行为变得非常奇怪。 以下是启动日志: 所以,在启动过程中,应用程序尝试在单独的Java线程中获取MongoConnection,但失败了,但没有

  • 问题内容: 我有以下表格示例。Thera可以是无限的分支机构和客户。我需要对该分支进行分组并计算他们的客户,然后用不同的列来显示它。 请注意,可以有无限的分支和客户,查询不仅必须在这种情况下有效。 在这种情况下,可接受的结果是: 示例SQL DATA 问题答案: 我认为写一个返回变量结构的流水线表函数虽然很复杂,但却是可能的。您的管道表函数将使用Oracle Data Cartridge接口和An

  • 问题内容: 你好,我有这个设置 我需要为每个按钮获取以下内容 在Java中是否可以为我声明的每个按钮动态创建此按钮?因为当我有5个按钮时,我不需要3x5 = 15行代码,而是只有几行具有动态创建的按钮。 问题答案: 编写一个小循环并将您的按钮存储在数组中: