Grails 在创建 Sql 对象时使用 SessionFactory 与 dataSource

Grails using SessionFactory vs. dataSource when creating Sql Object

在 Grails 中,我可以通过两种方式创建 Sql 对象:

def sql = new Sql(sessionFactory.currentSession.connection())
def sql = new Sql(dataSource)

我已经在 Whosebug 上阅读了这个帖子:Getting the SessionFactory for a particular Datasource in Grails ...答案之一是数据源“...吞噬过多的连接更好地使用sessionFactory.currentSession.connection()

这个建议是否正确,这两者之间有什么区别?

当检查创建的对象时,我可以看到它们几乎相同,只有 2 个属性不同: dataSourceuseConnection.

dataSource 的情况下,它是 dataSource=TransactionAwareDataSourceProxy 和 useConnection=null,而对于 sessionFactory 它是 dataSource=null 和 useConnection=$Proxy 36.

为什么这与 "gobblin up excessive connections" 的结果不同?

关于 "gobbling up excessive connections" 的评论基于一些假设,这些假设在您的情况下可能是正确的,也可能不是。

由于 Grails 和 GORM 使用的视图模式中的会话,假设 Hibernate 在请求期间将要、已经或将要创建到数据库的连接。在那种情况下,您将为 Hibernate 使用一个连接,为其他连接使用 n 个连接。

如果您混合使用 GORM 和 SQL 连接,从 sessionFactory 获取连接会更安全。

我似乎记得旧版本的 Grails 用于创建连接,即使在请求期间没有执行任何 GORM 方法。我不完全确定更新版本是否仍然如此 (2.x+)