1

我们正在使用 SQL Server 和 GORM (Grails / Hibernate)。

最近我们的 DBA 询问我是否可以在数据库中的某个关键路径表上使用存储过程而不是普通的 Hibernate 准备语句。他并不关心性能或类似的事情,而是解释说,他很难分析 Hibernate 准备好的语句,因为粗略地引用,“在会话中的某个地方,你会得到一个包含 SQL 文本的准备好的语句......然后您只需获得准备好的语句的执行者。在生产系统中协调两者几乎是不可能的”。

当然,我更愿意在我们的应用程序中使用具有正常插入/更新/删除行为的域类,而不是手动构建/执行准备好的语句。于是我想到了两个问题:

  1. SQL Server Profiler 是否可以通过某种方式进行配置,或者是否有一些技术可以更轻松地分析 Hibernate 准备好的语句?如果不...
  2. 是否可以在我的 Hibernate / Grails 应用程序中进行一些非侵入式自定义,以像往常一样使用域类,但会更改后端代码生成(我不知道,也许使用 Hibernate 拦截......也许我可以指定一个SP 使用而不是准备好的语句进行特定的插入/更新/删除操作......或者我可以指出准备好的语句应该有一个固定的“名称”,这可能有助于在分析会话中让 DBA 识别它...... )。

更新

从 SQL Server Profiler 会话中获取的示例:

--sp_prepare on first execute
declare @p1 int
set @p1=8
exec sp_prepare @p1 output,N'@P0 int',N'select <columns> from <table> where <primary key> = @P0 ',1
select @p1
go

--sp_execute thereafter
exec sp_execute 8,1
go
4

1 回答 1

2

如果是, SQL Server Central 上sp_prepare有一篇文章说您可以在 Hibernate 配置中将其关闭,例如:

<property name='prepare_sql'>false</property>

看起来 Hibernate 将在关闭此设置的情况下发送参数化查询。这将允许 SQL Server 像准备好的查询一样缓存计划。

但是,一些文章建议如果没有prepare_sql,Hibernate 会改变字符串的参数大小。这将使 SQL Server 的计划缓存失效。您可能需要进一步调查。

于 2013-06-06T16:47:40.903 回答