gpt4 book ai didi

grails - Grails是否可以确保在请求中的调用之间重用数据源连接?

转载 作者:行者123 更新时间:2023-12-02 14:56:17 25 4
gpt4 key购买 nike

问题:使用grails,SQL Server和DBA希望使用触发器来审核用户数据库 Activity (我知道审核插件)。他们建议在每次数据库调用之前设置SQL Server的CONTEXT_INFO,在上下文中设置用户名,然后由触发器提取用户名。我正在考虑增加GORM save等。像这样的方法:

private replaceSave(domainClass) {

def saveMethod = domainClass.metaClass.pickMethod("save", [Map] as Class[])

domainClass.metaClass.save = { Map params ->
def sql = new Sql(dataSource)
sql.execute("DECLARE @U varbinary(0128);SET @U = CONVERT(varbinary(0128),'the-username');SET CONTEXT_INFO @U;")
saveMethod.invoke(delegate, [params] as Object[])
sql.execute("DECLARE @U varbinary(0128);SET @U = CONVERT(varbinary(0128),'');SET CONTEXT_INFO @U;")
}
}

我不知道这种技术是否可以确保saveMethod使用的dataSource连接与Sql对象的连接使用的连接相同。我的理解是Grails使用OpenSessionInView模式,这似乎暗示着相同的连接已被重用,但是我只是在猜测,并且为此编写了一个全面的测试有困难。谢谢!

最佳答案

可以尝试改善答案:

查看groovy.sql.Sql,您会看到,如果使用dataSource创建实例,则对于每次执行,该类都将使用dataSource.getConnection()。今天,在使用Oracle时,遇到了两次不同的 session 。我不得不使用sql.cacheConnection来解决它。

所以:

//this depends on the dataSource.getConnection()
Sql sql = new Sql(dataSource)

//this will always use the same connection
Sql sql = new Sql(connection)

如果我没记错的话,grails域类方法使用的连接在 sessionFactory中可用。我不知道您在哪里定义 replaceSave方法,但如果可以访问 sessionFactory,则可以确保使用以下方法使用相同的连接:
Sql sql = new Sql(sessionFactory.currentSession.connection())

这样可以确保所有groovy sql执行都将使用相同的连接。

关于grails - Grails是否可以确保在请求中的调用之间重用数据源连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11848501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com