我们的Java应用程序经常运行繁重的数据库查询。由于Java进程和Oracle进程在同一台计算机上运行,因此这些繁重的查询可能会占用大量CPU或IO,因此重要的应用程序线程(即用户请求)会变得无响应。
我正在寻找一种解决方案来确定Oracle中事务(或连接或连接池)的优先级。我知道Oracle的资源管理器功能,但我们没有使用它的许可。
如果无法确定优先顺序,是否可以在中间暂停甚至终止交易?
我们正在运行Linux,J2EE,hibernate / sql
答案 0 :(得分:1)
我的2美分价值:尝试控制Java(即应用程序)级别的优先级,而不是依赖Oracle。这可以使用线程消耗数据库请求的PriorityBlockingQueue
来完成。
答案 1 :(得分:1)
我相信你没有尝试从UI的事件派发线程执行这些数据库操作:)
您可能会尝试搞乱线程优先级;在数据库线程上使用较低的优先级,以便UI保持响应。但是,这可能没有效果,可能还有其他问题,例如优先级倒置。
另一个想法是将短暂的睡眠放在数据库线程中,或者每隔一段时间尝试一次yield()。这些应该在数据库事务之外完成,这样您就不会阻止其他并发数据库客户端。
答案 2 :(得分:0)
在Oracle方面,我肯定不建议搞乱Oracle服务器进程优先级。主要原因是,在任何给定时刻,Oracle进程可能在SGA的某个元素上持有锁或锁。如果降低进程的优先级,并且它持有锁和/或锁存器,则最终会影响其他Oracle服务器进程的性能,因为它们在锁定/锁存器持有者后排队,这是低优先级,现在可以得到任何CPU。
Oracle本身确实允许某些后台进程以更高的优先级运行,但这是设计的,以及内置于Oracle的功能。我不会弄乱各个服务器进程的优先级。
最后,我真的看看将Java应用程序代码移动到不同服务器的可行性。这样,Oracle和Java就没有竞争听起来像是稀缺资源的东西。
希望有所帮助。