首页 文章

如何在Hibernate会话中使用全局临时表?

提问于
浏览
0

我在我的数据库中创建了一个全局临时表 . 我正在使用它将少量处理过的数据合并到一个更大的表中 .

我正在写一个临时表,并在一个服务中删除它,该服务一次响应一个请求 . 每个请求应使用不同的数据库会话,以便数据不会在请求之间发生冲突 . 也就是说,我希望数据库会话关闭并在请求之间重新打开,以便一个请求的数据对下一个请求的数据不可见 .

我们的应用程序使用Hibernate来管理数据库会话 . 我发现从文档中很难理解数据库会话和hibernate会话之间的关系 - 但是看来Hibernate在我的类中给了我相同的数据库会话,即使我调用openSession()然后调用session.close ()请求之间 . 我写了一些测试代码来测试这种行为 .

public void testTemporaryTable() {
    Session session = sessionFactory.openSession();
    writeToTemporary(session);
    System.out.println(countDataInTemporary(session));
    ...
    mergeFromTemporay(session);
    // Here I'm hoping for a closed db session, to make the data disappear:
    session.close();

}

当我从同一个主线程运行两次时,第一次在临时表中看到70,000个结果 . 我第二次运行它,我看到了140,000个结果 . 如果数据库会话实际已关闭且会话工厂openSession给了我一个新的数据库会话,那么我第二次只能看到70,000个结果 .

我希望有一个简单的解决方案,因为临时表使管理大量处理数据变得更加容易 .


我发现了什么:

  • Hibernate会话与数据库会话不是一一对应的 . 在我们的系统中,我们使用连接池,Hibernate会话使用池中的连接 . 使用连接池和休眠会话的好处是减少创建连接的需要,这是昂贵的 .

解决方案:

  • 在同一服务线程内的使用之间截断临时表 .

为什么要临时表?

  • 关闭服务时删除数据,这发生在用户会话之间 .

  • 如果服务在处理过程中途中止,则删除数据 . 不幸的是,经常发生这种情况 .

1 回答

  • 0

    Hibernate会话与数据库会话不是一对一的对应关系 . 因此,要使用临时表而不保证数据库会话将在后续hibernate会话之间续订,应截断它以删除数据 . 这是一种低成本的操作 .

相关问题