如何在 Hibernate 会话中使用全局临时 table?
How can I use a global temporary table with Hibernate session?
我在我的数据库中创建了一个全局临时文件 table。我用它来将少量处理过的数据合并成更大的 table.
我正在写入临时 table 并在一次响应一个请求的服务中从中删除。每个请求都应该使用不同的数据库会话,这样数据就不会在请求之间发生冲突。也就是说,我希望数据库会话在请求之间关闭并重新打开,以便一个请求的数据对下一个请求的数据不可见。
我们的应用程序使用 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();
}
当我从同一个主线程 运行 这两次时,我第一次在临时 table 中看到 70,000 个结果。第二次我 运行 它,我看到了 140,000 个结果。如果数据库会话实际上已经关闭并且会话工厂 openSession 为我提供了一个新的数据库会话,我第二次应该只能看到 70,000 个结果。
我希望有一个简单的解决方案,因为临时 table 可以更轻松地管理已处理的大量数据。
我的发现:
- Hibernate 会话与数据库会话不是一一对应的。在我们的系统中,我们使用连接池,Hibernate 会话使用来自池的连接。使用连接池和休眠会话的好处是减少了创建连接的需要,因为这是昂贵的。
解决方法:
- T运行在同一服务线程中使用之间的临时 table。
为什么是临时 table?
- 服务关闭时会删除数据,这发生在用户会话之间。
- 如果服务在处理中途中止,数据将被删除。不幸的是,这种情况经常发生。
Hibernate 会话与数据库会话不是一一对应的。因此,要使用临时 table 且不能保证数据库会话将在后续休眠会话之间更新,应将其截断以删除数据。这是一个低成本的操作。
我在我的数据库中创建了一个全局临时文件 table。我用它来将少量处理过的数据合并成更大的 table.
我正在写入临时 table 并在一次响应一个请求的服务中从中删除。每个请求都应该使用不同的数据库会话,这样数据就不会在请求之间发生冲突。也就是说,我希望数据库会话在请求之间关闭并重新打开,以便一个请求的数据对下一个请求的数据不可见。
我们的应用程序使用 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();
}
当我从同一个主线程 运行 这两次时,我第一次在临时 table 中看到 70,000 个结果。第二次我 运行 它,我看到了 140,000 个结果。如果数据库会话实际上已经关闭并且会话工厂 openSession 为我提供了一个新的数据库会话,我第二次应该只能看到 70,000 个结果。
我希望有一个简单的解决方案,因为临时 table 可以更轻松地管理已处理的大量数据。
我的发现:
- Hibernate 会话与数据库会话不是一一对应的。在我们的系统中,我们使用连接池,Hibernate 会话使用来自池的连接。使用连接池和休眠会话的好处是减少了创建连接的需要,因为这是昂贵的。
解决方法:
- T运行在同一服务线程中使用之间的临时 table。
为什么是临时 table?
- 服务关闭时会删除数据,这发生在用户会话之间。
- 如果服务在处理中途中止,数据将被删除。不幸的是,这种情况经常发生。
Hibernate 会话与数据库会话不是一一对应的。因此,要使用临时 table 且不能保证数据库会话将在后续休眠会话之间更新,应将其截断以删除数据。这是一个低成本的操作。