关于weblogic中使用prepared statement cache后操作DDL的问题
2009-09-22 00:00:00 来源:WEB开发网前几天有客户问我这么个问题,他们在weblogic中配置了prepared statement cache, 而他们应用中有操作DDL的地方,比如alter table什么的,这时候如果使用cached prepared statement的话,Oracle端会抛出SQLException: 违反协议。其实这个问题,weblogic 文档中已经有描述,如下:
http://e-docs.bea.com/wls/docs81/ConsoleHelp/jdbc_connection_pools.html#1107805
大概意思是:这个依赖数据库,需要看数据库端怎么处理这样的prepared statement. 最初我认为只要在weblogic 端手工清理掉整个cache就可以了(weblogic在prepared statement 出现异常的时候,会主动将wrapper connection上对应的prepared statement cache清掉,下次调用的时候会重建prepared statement,所以手工清理cache是完全多余的),但实际结果并不如想象的那样。即使我们clear掉prepared statement cache, 重新创建一个prepared statement的话,问题同样得不到解决。 为什么? 怎么办?作了几个相关的测试后,结论是:这个行为依赖于DB的physical connection, 而不是单个的prepared statement,出现这样的问题后,能做的有如下2种方式:
1:客户端处理prepared statement抛出的异常, catch到异常后,需要将physical connection拿出来close掉。之所以建议这样,客户从data source中拿出的是个logical connection,而physical connection一直在connection pool。如果简单的close掉logical connection, 重新去拿一个logical connection的话,weblogic无法保证返回的connection用了不同的physical connection。后面会有详细的解决办法。
2:等待,大约一分钟左右,可以正常操作。
首先看看为什么?
更多精彩
赞助商链接