获取java.sql.SQLException:ORA-04031:

时间:2010-01-18 08:51:42

标签: oracle

通过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正确执行。

3 个答案:

答案 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)

oracle forum上找到了类似的问题,似乎有效的解决方案是:

  

用户的tnsnames条目中没有server=dedicated。添加此行使查询有效。

希望这有帮助。

答案 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 ......