gpt4 book ai didi

hibernate - 如何使用try-catch和资源语句来关闭连接

转载 作者:行者123 更新时间:2023-12-02 23:37:26 24 4
gpt4 key购买 nike

我正在开发一个基于 Struts2-Hibernate 动态 Web 的应用程序,它与数据库建立连接。在建立连接的过程中,大多数时候我忘记关闭连接。所以有任何方法可以通过try-catch-resource来实现这一点。我也浏览过javaDoc ,但这引起了我的困惑。这是我从JavaDoc得到的,如果我错了请纠正。

具有连接代码的类必须实现AutoCloseable。这给出了一种方法public void close() throws Exception。现在我的问题是在 close 方法中编写什么代码以及如何使用实现 AutoCloseable 的 Connection 类。

MyConnectionClass

public class StuHibernateUtils implements AutoCloseable {

static SessionFactory sessionfactory;

static
{
Configuration cfg=new Configuration().configure("/student.cfg.xml");
ServiceRegistry registry=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
sessionfactory=cfg.buildSessionFactory(registry);
}

public static SessionFactory getSessionFactory()
{
return sessionfactory;
}

public static Session getSession()
{
return sessionfactory.openSession();

}

@Override
public void close() throws Exception {
// TODO Auto-generated method stub

}
}

如何使用 StuHibernateUtils 实例自动关闭连接。

最佳答案

我认为您应该寻求使 Session AutoCloseable 而不是您的帮助程序类?

遇到 Hibernate 似乎不支持 AutoCloseable 的事实,但我假设您当前的代码如下:

Session session = null;

try {
session = sessionFactory.openSession();
...
} finally {
if (session!=null) session.close()
}

您是否希望执行以下操作,以免忘记关闭 session ?

try (Session session = sessionFactory.openSession()) {
...
}

在我的项目中,我创建了一个 CloseableSession,它实现 AutoCloseable 并提供对底层 session 的访问。不幸的是,由于 AutoClosable 和 Session 都有 close() 方法,我无法同时实现这两个方法并使用正常的委托(delegate)模式。

public class CloseableSession implements AutoCloseable {

private final Session session;

public CloseableSession(Session session) {
this.session = session;
}

public Session delegate() {
return session;
}

@Override
public void close() {
session.close();
}
}

这意味着您可以执行以下操作, session 将自动关闭。

try (CloseableSession session = new CloseableSession(
sessionFactory.openSession())) {
...
}

尽管这确实意味着无论何时您想使用 session ,您现在都必须调用 session.delegate().foo()。

顺便说一句,使用静态方法来提供 session 可能看起来可以节省时间,但静态方法通常会导致单元测试等出现问题,并且它们使将当前实现替换为另一个实现变得更加困难。我建议在需要的地方传递 SessionFactory 或 StuHibernateUtils 类。

关于hibernate - 如何使用try-catch和资源语句来关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24041170/

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