我想知道是否有办法让Hibernate在会话缓存中有太多特定类型的对象时生成某种控制台警告。我想这样做进行负载测试,因为我们在从Oracle加载BLOB时遇到OutOfMemoryException
个问题。
我们现在仍在使用Hibernate 3.6.10
。我们目前用于此测试的最佳方法是生成比系统在正常用例中能够处理的更多数据,并尝试加载父对象并查看它是否崩溃。这样做只是感觉很糟糕。
欢迎任何建议。
我忘了提到的一个注意事项是,这个“日志记录”的想法是我希望能够留在生产代码中来查明具体问题。
- 编辑 -
以下是我正在尝试做的一个例子:
假设我有@Entity ClassX
,其中包含@Entity ClassY
个对象的延迟加载列表。一些方法,我希望在会话缓存中加载100个或更多ClassY
个实例时发出日志消息。这样,在开发期间,我可以加载一个ClassX
对象,并注意我是否(或团队中的其他开发人员)碰巧在我不应该访问该列表时。
答案 0 :(得分:1)
您可以附加Interceptor
来监听对象加载事件,维护每个唯一实体类型的计数,并在超过某个阈值时记录警告。 The documentation向您展示如何通过在创建时传入它来定义会话范围的拦截器:
Session session = sf.openSession( new AuditInterceptor() );
您很可能不会手动创建会话,因此这可能没有帮助,但可能您声明会话的方式有一些方法可以通过Interceptor
。
声明一个SessionFactory范围的拦截器更容易,但是它似乎没有给你任何关于在其中创建对象的Session的引用,否则你将能够在某个方面找到某种计数器。 WeakHashMap
(以Session为关键,以免泄漏内存)。如果您使用默认的线程本地会话策略,那么您可以随时询问sessionFactory.getCurrentSession()
。