【问题标题】:Grails using SessionFactory vs. dataSource when creating Sql ObjectGrails 在创建 Sql 对象时使用 SessionFactory 与 dataSource
【发布时间】:2016-06-02 17:36:21
【问题描述】:

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

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

我在 Stackoverflow 上读过这个帖子:Getting the SessionFactory for a particular Datasource in Grails ...其中一个答案是 dataSource “...吞噬过多的连接以更好地使用 sessionFactory.currentSession.connection()

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

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

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

为什么这与“地精连接过多”的后果有所不同?

【问题讨论】:

    标签: grails datasource sessionfactory


    【解决方案1】:

    关于“吞噬过多的连接”的评论基于一些假设,在您的情况下可能是正确的,也可能不是。

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

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

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

    【讨论】:

    • 仅供参考...切勿将 Sql 对象存储在实例字段中并重用。每次需要使用时创建一个新的 Sql 实例。我不记得为什么了,但我问过 LaForge 先生,他说 Sql 对象不能被重用或共享。
    • @ToddWCrone 是的,这是真的。这是因为 SQL 对象实现了它自己的连接处理来关闭连接等等。不让它这样做就是自找麻烦……
    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2013-01-07
    • 2011-11-13
    • 2015-08-16
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多