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

Oracle 获取java.sql.SQLException:ORA-04031:,oracle,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正确地执行了相同的查询。在上发现了一

当通过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正确地执行了相同的查询。

在上发现了一个类似的问题,似乎有效的解决方案是:

用户的tnsnames条目中没有
server=dedicated
。在中添加此行使查询工作正常


希望这能有所帮助。

您的Java代码没有使用绑定变量的可能性很大。在这种情况下,每个SQL语句都是唯一的,不会被重用,从而破坏共享池。它将变得支离破碎,最终产生ORA-04031

重新启动数据库只会暂时起作用,但最终会遇到同样的问题。增加共享池大小并定期重新启动数据库不是真正的解决方案。唯一真正的解决方案是重写SQL以使用绑定变量

下面是一个AskTom线程,其中有人经历了类似的事情:

在这个线程中可以找到一个很好的小程序来跟踪哪些SQL语句没有使用绑定变量:

希望这有帮助

问候,,
Rob.

在metalink中,他们声明如下:

ORA-04031错误通常是由于库缓存或共享池保留空间中的碎片造成的。在增加共享池大小之前,考虑调整应用程序以使用共享SQL和调谐SydDyPoLoLyScript、SydRyPoLoSaveVerdEdsig和SyddPooLySaveVerdEdMixOLLC。 首先,通过发出以下查询确定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是共享池保留空间中缺少连续空间的结果,如果: (请求\u失败>0)和(上次\u失败\u大小>共享\u池\u保留\u最小\u分配)

为了解决这个问题,考虑增加SypDyPoLoSypRevEdMixOLLC,以减少被缓存到共享池预留空间中的对象的数量,并增加SydDyPoLoPosivEdEdSead和SydDyPoLoLeSIZE,以增加共享池预留空间中可用的内存。 ORA-04031是库缓存中缺少连续空间的结果,如果:

(请求\u失败>0)和(上次\u失败\u大小<共享\u池\u保留\u最小\u分配)

(请求\u失败为0)和(上次\u失败\u大小<共享\u池\u保留\u最小\u分配)


第一步是考虑降低SyddPoPoLySaveVeDeMixOLLC,以将更多的对象放入共享池预留空间,并增加SydDyPoLoLySelf……/P>这是Oracle服务器配置中的一个问题。如果查询通过其他工具执行良好,则问题最好属于该问题,因此不太可能出现服务器配置问题。嘿,请在重新启动数据库后关闭此问题,并且它不允许在同一服务器上运行多个实例。不是个好主意:)