通过Web应用程序执行查询时,我收到了以下内容
java.sql.SQLException: ORA-04031:
java.sql.SQLException: ORA-04031: unable to allocate 48784 bytes of shared memory ("shared pool","SELECT emplid levempid, '2...","Typecheck","qry_text : qcpisqt")
但同样的查询正在通过TOAD正确执行。
答案 0 :(得分:8)
您的Java代码没有使用绑定变量的可能性非常高。在这种情况下,每个SQL语句都是唯一的,不会被重用,从而破坏共享池。它将变得支离破碎,最终导致ORA-04031。
重新启动数据库只会暂时起作用,但最终会遇到同样的问题。增加共享池大小并定期重新启动数据库并不是一个真正的解决方案。唯一真正的解决方案是重写SQL以使用绑定变量。
这是一个体验类似事物的人的AskTom主题:http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:528893984337
在这个帖子中可以找到一个很好的小程序来跟踪哪些SQL语句没有使用绑定变量:http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1163635055580
希望这有帮助。
此致 罗布。
答案 1 :(得分:2)
答案 2 :(得分:1)
在metalink中,他们将其声明为:
ORA-04031错误通常是由于库缓存中的碎片或 共享池保留空间。在增加共享池大小之前 考虑调整应用程序以使用共享的sql和调优 SHARED_POOL_SIZE,SHARED_POOL_RESERVED_SIZE和 SHARED_POOL_RESERVED_MIN_ALLOC。 首先确定ORA-04031是否是碎片的结果 图书馆 通过发出以下查询缓存或在共享池保留空间中:
SELECT free_space,avg_free_size,used_space, avg_used_size,request_failures,last_failure_size FROM v $ shared_pool_reserved; ORA-04031是共享池中缺少连续空间的结果 预留空间如果: REQUEST_FAILURES是> 0和LAST_FAILURE_SIZE是> SHARED_POOL_RESERVED_MIN_ALLOC。
要解决此问题,请考虑将SHARED_POOL_RESERVED_MIN_ALLOC增加到更低 被缓存到共享池保留空间中的对象数量 增加SHARED_POOL_RESERVED_SIZE和SHARED_POOL_SIZE以增加 共享池保留空间中的可用内存。
ORA-04031是库缓存中缺少连续空间的结果 如果:
REQUEST_FAILURES是> 0和LAST_FAILURE_SIZE是< SHARED_POOL_RESERVED_MIN_ALLOC
或
REQUEST_FAILURES为0且LAST_FAILURE_SIZE为< SHARED_POOL_RESERVED_MIN_ALLOC
第一步是考虑降低SHARED_POOL_RESERVED_MIN_ALLOC 至 将更多对象放入共享池保留空间并增加 SHARED_POOL_SIZE ......