close
Oracle本身提供Stored Procedure與Function call兩種機制便於開發者將loading轉給Oracle負擔:Stored Procedure為預先編譯,可獲較佳效能;而Function call則可被SQL語法呼叫,具重複使用功能。茲區分如下:
Stored Procedure | Function call | |
Compiler | 預先編譯存到DB | 執行期編譯 |
Return value | 可不回傳resultset,最多回傳1024個 | 至少且只能回傳一個resultset |
被SQL引用 | 不能 | 能,包括where, having... |
update Database | 能使用commit | 無法使用commit |
mainly used | process the tasks | compute values |
Queue住的問題 | 未知 | 會 |
在專案過程,一度以為Function的執行期編譯與會Queue住multi-request的情形會拖垮效能導致掛掉,後來請教學長,恐怕是裡面使用Cursor的緣故,不管是Fucntion或者是Stored Procedure。
大部分DB的Cursor都是使用C語言寫的,Cursor就相當於C語言的File handle,而OS對File Handle的配給有其上限,所以在壓力測試之下,File Handle都已分配完畢且都在使用中,再進來的Request因為沒有配額而出錯,而正使用中的Cursor的handle是有可能因此得不到Release,對J2EE AP Server而言,它在OS下只是一條process,所以因Cursor handle不足,導致Oracle的Function機制掛掉,但對Oracle的select仍可使用。
全站熱搜