当通过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正确执行.
您的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
希望这可以帮助.
问候,Rob.