4

我想知道是否有办法告诉 Hibernate 在会话缓存中有太多某种类型的对象时生成某种控制台警告。我想这样做以进行负载测试,因为我们OutOfMemoryException有时会遇到从 Oracle 加载 BLOB 的问题。

我们现在还在使用Hibernate 3.6.10。我们目前进行此测试的最佳方法是生成比系统在正常用例中能够处理的更多的数据,并尝试加载父对象并查看它是否崩溃。这样做只是感觉有点糟糕。

欢迎任何建议。

我忘记提到的一个注意事项是,我希望能够将这种“记录”想法留在生产代码中以查明具体问题。

- 编辑 -

这是我正在尝试做的一个例子:

假设我有@Entity ClassX一个延迟加载的@Entity ClassY对象列表。ClassY以某种方式,我希望在将 100 个或更多实例加载到会话缓存中时吐出一条日志消息。这样,在开发过程中,我可以加载一个ClassX对象并注意我(或团队中的其他开发人员)是否碰巧在我不应该访问该列表时访问该列表。

4

1 回答 1

1

您可以附加一个Interceptor监听对象加载事件,维护每个唯一实体类型的计数,并在超过某个阈值时记录警告。该文档向您展示了如何通过在创建时传入它来定义会话范围的拦截器:

Session session = sf.openSession( new AuditInterceptor() );

很可能您没有手动创建会话,因此这可能没有帮助,但您声明会话的方式可能有某种传递方式Interceptor

声明一个 SessionFactory 范围的拦截器更容易,但它似乎没有给你任何对正在创建对象的 Session 的引用,否则你可以在WeakHashMap(使用 Session作为关键,这样你就不会泄漏内存)。如果您使用默认的 Thread-local 会话策略,那么您可以随时询问sessionFactory.getCurrentSession().

于 2013-03-12T20:03:00.440 回答