III. Binding and defining Oracle8 C datatypes
CHƯƠNG VII I: OBJECT CACHE AND OBJECT NAVIGATION I.Object cache vă quản lý vùng nhớ
I.Object cache vă quản lý vùng nhớ
Object cache lă vùng nhớ đệm client-side cung cấp cho việc tìm kiếm vă quản lý vùng nhớ phục vụ cho câc object . Nó lưu trữ vă tìm kiếm câc thực thể của object mă đê thu được từ một ứng dụng OCI .
Khi câc object được tìm bởi phât biểu SQL SELECT hoặc OCIpin thì một bản sao object được chứa trong object cache . Câc object được tìm trực tiếp từ phât biểu SELECT thì thu được giâ trị vă chúng lă câc object không tham chiếu được (non-referenceable) .Chỉ có câc object referenceable mới có thể tham chiếu được .
Nếu một object được tham chiếu vă có một phiín bản trong cache thì không cần nhận nó về từ server .
Trong chế độ object một chương trình client sử dụng Oracle8 OCI không tham chiếu (dereference) để tìm câc object dùng object cache thì một client-side object cache được hcỉ định cho mỗi lần khởi tạo môi trường liín kết OCI . Nhiều công việc của một quâ trình có thể dùng chung một client-side cache bằng câch chia môi trường liín kết OCI (OCI enviroment handle) .Có đúng một bản sao của mỗi lần tham chiếu object trong cache cho mỗi lần liín kết . Tham chiếu REF nhiều lần hoặc tham chiếu câc REF tương đương thì trả về một bản sao của Object .
GVHD :KS.Bùi Hoăi Thắng
Nếu sửa một bản sao của object trong cache thì phải đưa sự thay đổi năy đến server trước khi chúng được nhìn thấy ở quâ trình khâc . Câc object không còn được sử dụng hoặc thời gian không tham chiếu dăi hơn được đưa ra ngoăi cache giải phóng vùng nhớ mă chúng chiếm giữ . Object cache duy trì mối liín kết giữa tất cả câc bản sao vă câc object tương ứng trong CSDL . Cache không quản lý việc giải phóng câc bản sao của object vă cũng không tự động nạp lại câc bản sao . Ứng dụng phải bảo đảm tính đúng đắn vă không đổi của câc bản sao của object cần giải phóng . Ví dụ nếu ứng dụng đânh dấu một bản sao của object để insert , update , delete rối sau đó bỏ dở giao dịch thì cache không đânh dấu bản sao object nhưng không hoặc lăm mất hiệu của bản sao năy . Ứng dụng phải tham chiếu gần hoặc xa nhất hoặc nạp lại bản sao object trong lần giao dịch kế tiếp . Nếu ứng dụng tham chiếu tại bất kỳ thời điểm năo thì nó sẽ nhận bản sao không có răng buộc về câc thay đổi trước đó .
Object cache được tạo ra khi môi trường liín kết OCI được khởi tạo sử dụng hăm
OCIInitialize() . Mỗi quâ trình ứng dụng chạy cùng một server thì có một object cache cho nó như hình 11-1 :
Application 1
Object cache
Application 2 Object cache
System Glo. Area (SGA)
O Oracle8 Database Hình 11-1 : Object cache
Object cache tìm câc object hiện tại trong bộ nhớ , duy trì tham chiếu đến câc object năy , quản lý sự trao đổi tự động câc object vă thuộc tính trao đổi .
1. Cache consitency and coherency
Nếu một một ứng dụng thay đổi một bản sao thì sự thay đổi năy không tự động gắn văo object tương ứng trong CSDL vă ngược lại . Object cung cấp câc hoạt động như lă flushing bản sao object đê sửa chữa đến CSDL vă nạp lại bản với giâ trị mới nhất từ CSDL văo chương trình thực thi để duy trì tính coherency . Oracle8 không hổ trợ bất kỳ cache coherency tự động năo với buffer cache của server hoặc CSDL . Cache coherency tự động chỉ đến một mây bằng việc object cache nạp lại câc bản sao object cục bộ khi câc object tương ứng được thay đổi trong buffer cache của server vă object cache đưa câc thay đổi của bản sao object cục bộ đến buffer cache trước khi có sự truy cập trực tiếp của câcobject tương ứng trong server . Sự truy cập trực tiếp bao gồm sử dụng SQL , khởi động quâ trình , câc thủ tục lưu trữ để đọc hoặc sửa câc object trong server
2 . Câc tham số object cache
Object cache có 2 tham số quan trọng được liín kết với nó mă chúng lă câc thuộc tính của môi trường liín kết
OCI_ATTR_CACHE_MAX_SIZE : kích thước lớn nhất của cache OCI_ATTR_CACHE_OPT_SIZE : kích thước tùy định của cache
Hai tham số năy cho biết mức độ sử dụng cache vă giúp xâc định khi cache tự động chọn object để giải phóng vùng nhớ .
Nếu vùng nhớ đang bị chiếm bởi câc object trong cache được trêi rộng hoặc vượt quâ chiều cao được đânh dấu , cache tự động giải phóng câc object không được đânh dấu có số lần tham chiếu(pin count) bằng 0 . Cache tiếp tục giải phóng câc object cho đến khi bộ nhớ trống bằng kích thước tùy định hoặc cho đến khi không còn object thích hợp để giải phóng .
OCI_ATTR_CACHE_MAX_SIZE tỉ lệ phần trăm với OCI_ATTR_CACHE_OPT_SIZE
maximum_cache_size = optimal_size + optimal_size * max_size_percentage / 100
Hoặc
maximum_cache_size = OCI_ATTR_CACHE_OPT_SIZE + OCI_ATTR_CACHE_OPT_SIZE * OCI_ATTR_CACHE_MAX_SIZE / 100
Giâ trị mặc định của OCI_ATTR_CACHE_MAX_SIZE lă 10% Giâ trị mặc định của OCI_ATTR_CACHE_OPT_SIZE lă 200Kbyte 3 . Câc hoạt động của object cache
Phần năy mô tả câc hăm quan trọng nhất do object cache cung cấp để hoạt động trín câc bản sao object .
Pinning vă upping
Pinning một bản sao object cho phĩp ứng dụng truy cập nó trong cache bằng câch dùng REF tham chiếu đến nó .
Unpinning một object chỉ vùng cache mă object hiện tại không sử dụng .
GVHD :KS.Bùi Hoăi Thắng
Freeing một bản sao object lă xóa nó trong cache vă giải phóng vùng nhớ của nó
Marking vă Unmarking
Marking một object lă bâo cho cache biết rằng bản sao đê được cập nhật trong cache vă object tương ứng phải được cập nhật trong server khi bản sao object được flush
Unmarking một object lă xóa chỉ thị đến object đê được cập nhật .
flushing
Flushing một object lă viết câc thay đổi tạo nín sự đânh dấu câc bản sao object tương ứng với câc object trong server .Khi flushing xảy ra thì câc bản sao object trong cache được unmarking
Refreshing
Refreshing một bản sao object trong cache lă đặt lại giâ trị cho nó với giâ trị mới nhất của object tương ứng trong server .
4 . Loading vă remving câc bản sao object
Pinning một bản sao :
Khi một ứmg dụng cần tham chiếu một REF trong object cache nó gọi hăm OCIObjectPin() . Lời gọi năy tham chiếu đến REF vă gắn với câc bản sao object trong cache với điều kiện bản sao được tham chiếu . Một dạng khâc của hăm OCIObjectPin() lă OCIObjectPinArray() chứa câc object tham chiếu đến câc bản sao object . Cả hai hăm năy nhận tham chiếu tùy chọn "any" , "recent" , "latest"
+ Nếu tùy chọn lă "any" (OCI_PIN_ANY) object cache tức thì trả về bản sao object mă đê có trong cache nếu chỉ có một . Nếu không có object cache nạp bản sao mới nhất từ CSDL rồi sau đó trả về bản sao năy . Tùy chọn "any" thích hợp cho câc object chỉ đọc , thông tin , sự kiện , meta . Những object năy thường không có sự thay đổi nếu có thì cũng không ảnh hưởng đến ứng dụng .
+ Nếu tùy chọn lă "latest" (OCI_PIN_LATEST) thì object cache nạp văo cache bản sao mới nhất từ CSDL vă trả về bản sao đó trừ khi bản sao bị khóa , trong trường hợp bản sao bị đânh dấu (marked) thì được trả về ngay tức thì . Nếu object đê có trong cache vă không bị khóa thì bản sao mới nhất được ghi đỉ lín bản sao đó . Tùy chọn năy thích hợp cho câc object hoạt động như purchase order, bug, line item, bank account, stock quote . Câc object năy hay thay đổi nín chương trình cẩn thận khi truy xuất chúng .
+ Nếu tùy chọn lă "recent" (OCI_PIN_RECENT) thì có hai khả năng : trong cùng một giao dịch nếu bản sao được tham chiếu trước đó sử dụng tùy chọn "latest" hoặc "recent" thì tùy chọn "recent" tương đương tùy chọn "any" . Ngược lại tùy chọn "recent" tương tùy chọn "latest" . Khi chương trình tham chiếu object thì nó phải xâc định trị cho khoảng thời gian tham chiếu lă "transaction" hay "session" .
+ Nếu lă "session" (OCI_DURATION_SESSION) thì bản sao object còn lại được tham chiếu cho đến khi kết thúc session (kết thúc connection) hoặc cho đến khi nó không được tham rõ răng bởi chương trình ( bằng việc gọi hăm OCIObjectUnpin() ) .
+ Nếu lă "transaction" (OCI_DURATION_TRANS) thì bản sao còn lại được tham chiếu cho đến khi kết thúc transaction hoặc cho đến khi nó không được tham chiếu cụ thể .
Khi nạp một bản sao object văo cache từ CSDL thì cache thực thi có hiệu lực . SELECT VALUE(t) FROM t WHERE REF(t)=:r
t lă một bảng object chứa object , r lă REF nhận được giâ trị vă giâ trị trở thănh bản sao trong cache . Object cache thực thi phât biểu SELECT để nạp mỗi bản sao văo cache , trong một
giao dịch read-committed , câc bản sao object không được bảo đảm read-consistent trong mỗi lần nạp .
Mô hình object cache trực giao hoặc không phụ thuộc văo mô hình giao dịch của Oracle . Mặc dù câch thực hiện của object cache không phụ thuộc mô hình nhưng câc object được nhận về từ server thông qua object cache khi chạy cùng một chương trình lă khâc nhau dưới những mô hình khâc giao dịch khâc nhau .
Unpinning một bản sao object
Một bản sao object có thể không được tham chiếu khi nó không được sử dụng lđu bởi chương trình rồi sau đó nó bị giải phóng . Một bản sao phải hoăn toăn unpinned vă unmarked để được chọn giải phóng bởi cache khi cache cạn kiệt vùng nhớ . Để hoăn toăn một bản sao object phải pinned N lần vă unpinned N lần .
Một bản sao unpinned nhưng marked lă không thích hợp để giải phóng cho đến khi bản sao object đó được flush hoặc hoăn toăn unmarked bởi user . Tuy nhiín object cache hoăn toăn giải phóng câc bản sao object khi nó cạn kiệt vùng nhớ , vì vậy không cần thiết giải phóng một bản sao unpinned . Có thể object năy được tham chiếu lại (tùy chọn "any" hoặc "recent") Ứng dụng gọi hăm OCIObjectUnpin() hoặc OCIObjectPinCountReset() để không tham chiếu bản sao . Ngoăi ra có thể gọi hăm OCICaheUnpin() để không tham chiếu tất cả bản sao trong cache trong một nối kết cụ thể .
Freeing một bản sao object
Freeing một bản sao lă giải phóng nó khỏi object cache vă thu hồi vùng nhớ . Cache cung cấp hai câch giải phóng vùng nhớ :
+ Giải phóng tường minh : xóa bản sao object từ vùng cache bằng câch gọi hăm
OCIObjectFree() với tùy chọn marked hoặc unmarked . Có thể gọi hăm OCICacheFree() để giải phóng tất cả câc bản sao object trong cache .
+ Giải phóng tìm ẩn : khi cache cạn kiệt vùng nhớ nó giải phóng câc bản sao unpinned vă unmarked . Câc object unpinned vă marked được chọn để giải phóng tìm ẩn chỉ khi bản sao của nó được flushed hoặc unmarked .
Lý do để quản lý vùng nhớ lă rất quan trọng khi câc ứng dụng không tham chiếu câc object khi chúng không được sử dụng lđu . Điều năy tạo nín câc object có hiệu lực giảm sự lêo hóa vùng nhớ vă dễ dăng giải phóng vùng nhớ khicần thiết .
OCI không cung cấp hăm để giải phóng câc object không được tham chiếu trong client-side cache .
5 . Tạo sự thay đổi cho câc bản sao object
Marking một bản sao
Một bản sao có thể được tạo ra , xóa , cập nhật cục bộ trong cache . Nếu bản sao được tạo ra (gọi hăm OCIObjectNew()) thì bản sao object lă marked để thím văo object cache , vì vậy object sẽ được thím văo server khi bản sao của nó được flushed .
Nếu bản sao được cập nhật trong cache thì user phải thông bâo cho object cache bằng câch đânh dấu bản sao đê được cập nhật (gọi hăm OCIMarkedUpdate()) Khi bản sao được flushed thì object trong server được cập nhật với giâ trị bản sao .
Nếu bản sao bị xóa thì bản sao được đânh dấu xóa trong object cache (gọi hăm
OCIObjectMarkDelete()) . Khi bản sao được flushed thì object tương ứng trong server bị xóa . Vùng nhớ của bản sao bị đânh dấu nhưng không bị thu hồi cho đến khi nó được flushed vă
GVHD :KS.Bùi Hoăi Thắng
unpinned . Khi pinning một object bị đânh dấu để xóa thì chương trình nhận một lỗi cũng như chương tham chiếu đến một tham chiếu treo .
Khi user tạo nhiềi thay đổi trong một bản sao thì thay đổi sau cùng sẽ được thực hiện đến object trong server khi bản sao được flushed . Ví dụ user cập nhật vă xóa một bản sao thì object trong server bị xóa khi bản sao được flushed . Tương tự nếu một thuộc tính của một bản sao được cập nhật nhiều lần thì thuộc tính năy sẽ được cập nhật giâ trị sau cùng trong server khi bản sao được flushed .
Chương trình có thể đânh dấu một bản sao để cập nhật hoặc xóa nếu vă chỉ nếu bản sao đó được load văo cache .
Unmarking một bản sao
Một object bị đânh dấu có thể không bị đânh dấu trong object cache . Không đânh dấu bản sao của một object bị đânh dấu thì những thay đổi trong bản sao sẽ không được flush văo server . Object cache không hủy bỏ những thay đổi cục bộ trong bản sao . Chương trình gọi hăm
OCIObjectUnmark() để không dấu một object , gọi hăm OCICacheUnmark() để không đânh dấu tất cả bản sao object trong object cache đối với môt nối kết cụ thể .
6 . Câc hoạt động đồng bộ câc bản sao object với server
Flushing những thay đổi đến server
Những thay đổi cục bộ của bản sao object được đânh dấu trong sẽ được ghi văo server khi bản sao được flushed . Chương trình gọi hăm OCIObjectFlush() để flush một bản sao object hoặc hăm OCICacheFlush() để flush tất cả bản sao trong cache hoặc danh sâch bản sao được chọn . Hăm OCICacheFlush() flush tất cả câc bản sao object liín kết với một ngữ cảnh phục vụ cụ thể .
Sau khi flushing một bản sao thì bản sao bị khóa . Chú ý rằng object trong server bị khóa sau khi nó được flush vă bản sao cũng được đânh dấu để khóa trong cache . Hăm OCIcacheFlush() chỉ chịu một vòng đi đơn của server mặc dù có nhiều object được flush .
Nếu một ứng dụng yíu cầu flush câc object vô nghĩa của một kiểu năo đó thì chức năng năy đạt được thông qua lại hăm mă nó lă thông số cho cho hăm OCICacheFsh() . Ứng dụng có thể định nghĩa lại việc gọi năy để chỉ trả về những object mong muốn . Trong trường hợp năy hoạt chỉ chịu một vòng tròn đơn của server cho việc flush .
Nạp lại một bản sao
Khi được nạp lại một bản sao được load với giâ trị mới nhất của object tương ứng trong server . Giâ trị có thể bao hăm những thay đổi bởi câc giao dịch giân tiếp vă thay đổi trực tiếp (không thông qua object cache) trong server bằng giao dịch . Việc thay đổi trực tiếp trong server có thể sử dụng SQL DML , trigger , stored procedure .
Để nạp một bản sao bị đânh dấu , trước chương trình phải bỏ đânh dấu .Một bản sao không được tham chiếu bị giải phóng khi nó được nạp lại .
Chương trình gọi hăm OCIObjectRefresh() để nạp lại một bản sao hoặc hăm
OCICacheRefresh() để nạp lại tất cả bản sao được load trong một giao dịch (câc bản sao được tham chiếu gần hoặc xa nhất ) hoặc danh sâch câc bản sao được chọn .
Khi một bản sao được flush đến server câc trigger có thể bị sa thải để sửa nhiều object trong server . Câc object giống nhau (được sửa bởi trigger) trong object cache trở thănh ngoăi giới hạn đê định vă phải được nạp lại trước khi chúng bị khóa hoặc flush .
Câc cờ thuộc tính meta khâc nhau vă khoảng thời gian sửa chữa được mô tả trong bảng 11-1
Table 11-1 Object Attributes After Refresh
Object Attribute Status After Refresh
existent set to appropriate value
pinned unchanged
flushed reset
allocation duration unchanged
pin duration unchanged
Trong suốt quâ trình nạp lại , object cache load dữ liệu mới văo vùng nhớ mức trín của một bản sao , như vậy sẽ sử dụng lại vùng nhớ mức trín . Vùng nhớ mức trín chứa những thuộc tính in-line của object . Mặt khâc vùng nhớ cho câc thuộc tính out-of-line cho một bản sao có thể được di chuyển . Từ đó câc thuộc tính out-of-line có thể thay đổi kích thước .
7 . Câc hoạt động khâc
Khoâ câc object để cập nhật
Chương trình có thể gọi hăm OCIObjectLock() khóa một object để cập nhật . Hăm năy chỉ thị cho object cache nhận một row lock trín object trong CSDL tương đương với phât biểu
SELECT NULL FROM t WHERE REF(t) = :r FOR UPDATE