由于应用的需要,客户端程序很多(500个),它们跟Oracle之间采用长连接方式(即一直连接在Oracle上);由于连接数很多,为了优化性能,Oracle服务器采用共享连接方式。   现在出现Oracle占用内存不断增长的问题,Oracle方面的技术人员检查后,说是客户程序的问题。他说在共享连接方式下,如果客户程序使用拼SQL的方式来进行查询的话,会导致Oracle服务器不断消耗内存来存放这些SQL;而采用预编译、传参数的方式则没有这个问题   我怀疑这个说法,因为拼SQL的方式是极为常见的(很多情况是无法避免的),但如果这样会导致Oracle服务器出现内存不断消耗的话,实在说不过去。其实,SQLPLUS这个Oracle自带的工具,实际就是一个拼SQL的程序,莫非使用SQLPLUS去批量访问Oracle也能将Oracle搞死?   不过由于这次Oracle采用共享连接方式,以前没用过,所以也不敢轻言   望Oracle的高手指点一下,怎样才能解决这个问题,谢谢!

解决方案 »

  1.   

    使用共享模式要非常谨慎,如果你程序开发有问题,不但不会提升性能,很可能反使性能大幅度下降。我觉得Oracle技术人员没有说错哈,有这种可能,如果只有where条件的参数值不同,拼的SQL会在共享池中为每个参数生成SQL信息。
    如果使用绑定变量的话,那么就只有一条SQL,只是更改变量值,这是在性能优化中很重要的一点。Oracle技术人员应该说的就是绑定变量。
      

  2.   

    确实存在拼SQL会导致oracle不断地进行硬解析SQL语句,一般来说,拼SQL不是特别常见的,特别的负载大一点的应用,都会使用绑定变量的方式减少硬解析的次数修改程序吧,使用conn.prepareStatement("select ... from ... where cola=? and colb=?")类似的绑定变量的方式执行插入、查询、更新、删除就可以了