# DB Cache 使用與活用

## 如何裝入獨家數據並添加新數據

[**壟斷加載**](/proudnet.cn/proudnet/db_system/db_cache_ver2/theory.md#undefined)方法爲 <mark style="color:orange;">Proud.CDbCacheClient2.RequestExclusiveLoadData</mark> 。 您需要在參數 <mark style="color:orange;">fieldName</mark> 和 <mark style="color:orange;">cmpValue</mark> 中輸入查找條件以查找要加載的數據 。<br>

使用示例 。

```cpp
Proud::Guid outSessetionGuid;
Proud::CDbCacheClient2* c = ...;
c->RequestExclusiveLoadData(L"Gamer",L"GamerID",gamername,outSessetionGuid);
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestExclusiveLoadNewData</mark>方法同樣是專有裝入函數， 但在將數據添加到 RootTable 後立即寫入 。<br>

使用示例 。

```cpp
CPropNodePtr newNode = CPropNodePtr(new CPropNode(L"Gamer"));
 
newNode->Fields[L"GamerID"] = "Ulelio";
 
Proud::Guid outSessetionGuid;
Proud::CDbCacheClient2* c = ...;
c->RequestExclusiveLoadNewData(L"Gamer", newNode, outSessetionGuid);
```

## 單方面更改數據

> * Proud.CDbCacheClient2.UnilateralAddData
> * Proud.CDbCacheClient2.UnilateralUpdateData
> * Proud.CDbCacheClient2.UnilateralRemoveData

這些方法在DB cache存儲器中反映變更,之後在DBMS上以異步實際記錄,呼叫後立即返回。 此外，沒有回覆方法。

## 使用DBMS中首先反映的請求應答型方法和blocked方法

首先反映在DBMS上的請求響應方法和Blocked方法的使用是[**更改請求響應數據**](/proudnet.cn/proudnet/db_system/db_cache_ver2/theory.md#id-2)的方法。 呼叫後立即返回,變更只有在實際DBMS上完成記錄後,才能在DB cache的內存中反映出來。

<table data-full-width="false"><thead><tr><th width="294">呼叫方法</th><th>結果回撥</th></tr></thead><tbody><tr><td>Proud.CDbCacheClient2.RequestAddData</td><td>Proud.IDbCacheClientDelegate2.OnAddDataFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnAddDataSuccess</td></tr><tr><td>Proud.CDbCacheClient2.RequestUpdateData</td><td>Proud.IDbCacheClientDelegate2.OnUpdateDataFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnUpdateDataSuccess</td></tr><tr><td>Proud.CDbCacheClient2.RequestRemoveData</td><td>Proud.IDbCacheClientDelegate2.OnRemoveDataFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnRemoveDataSuccess</td></tr></tbody></table>

如果您想要blocked 調用， 而不是請求響應類型， 請使用這些方法 。

> * Proud.CDbCacheClient2.BlockedAddData
> * Proud.CDbCacheClient2.BlockedUpdateData
> * Proud.CDbCacheClient2.BlockedRemoveData

## 請求響應式 SessionGuid

獨佔Client各有一個Session,DB Cache Client爲了區分各Session,使用Guid值。\
請求時，通過Output參數獲取SessionGuid值，並獲取響應<mark style="color:orange;">Event的 CCallbackArgs::m\_sessionGuid</mark>獲取值。 保存<mark style="color:orange;">outSessionGuid</mark>後進行比較，可以確認請求的session。

**請求**

```
CDbCacheClient2::RequestExclusiveLoadNewData(String rootTableName, CPropNodePtr addData, Guid &outSessionGuid);
```

**回應**

```
IDbCacheClientDelegate2::OnExclusiveLoadDataFailed(CCallbackArgs args)
```

{% hint style="info" %}
**請求**中的 <mark style="color:orange;">outSessionGuid</mark> 等於**回應**中的 <mark style="color:orange;">args.m\_sessionGuid</mark>。
{% endhint %}

## 存取非專有數據方法

<mark style="color:orange;">Proud.CDbCacheServer2StartParameter.m\_allowNonExclusiveAccess</mark> 必須設定為允許非獨佔存取。

<table data-full-width="false"><thead><tr><th width="397">呼叫方法</th><th>結果回撥</th></tr></thead><tbody><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveSnapshotData</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveSnapshotDataFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveSnapshotDataSuccess</td></tr><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveAddData</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveAddDataAck</td></tr><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveRemoveData</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveRemoveDataAck</td></tr><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveSetValueIf</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveSetValueIfFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveSetValueIfSuccess</td></tr><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveModifyValue</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveModifyValueFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveModifyValueSuccess</td></tr></tbody></table>

非壟斷性數據變更成功後，該數據變更將申報給曾壟斷加載的DB cache client。 爲了申報,以下方法將回電。

> * Proud.IDbCacheClientDelegate2.OnSomeoneAddData
> * Proud.IDbCacheClientDelegate2.OnSomeoneRemoveData
> * Proud.IDbCacheClientDelegate2.OnSomeoneModifyValue
> * Proud.IDbCacheClientDelegate2.OnSomeoneSetValue

爲了便於查看,將各請求和回應關係捆綁起來如下。

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveSnapshotData</mark> : 獲取 Snapshot

```cpp
// 回應:
IDbCacheClientDelegate2::OnNonExclusiveSnapshotDataSuccess (CCallbackArgs args)
IDbCacheClientDelegate2::OnNonExclusiveSnapshotDataFailed (CCallbackArgs args)
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveAddData</mark> : 添加數據

```cpp
// 回應:
IDbCacheClientDelegate2::OnNonExclusiveAddDataAck (CCallbackArgs args)
// 被壟斷的DB Cache Client的Callback Event:
IDbCacheClientDelegate2::OnSomeoneAddData(CCallbackArgs& args)
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveRemoveData</mark> : 刪除數據

```cpp
// 回應:
IDbCacheClientDelegate2::OnNonExclusiveRemoveDataAck (CCallbackArgs args)
// 被壟斷的DB Cache Client的Callback Event:
IDbCacheClientDelegate2::OnSomeoneRemoveData (CCallbackArgs& args)
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveModifyValue</mark> : 對數據進行特定的運算。(+, -, \*, /)

```cpp
// 回應:
IDbCacheClientDelegate2::OnNonExclusiveModifyValueSuccess (CCallbackArgs args)
IDbCacheClientDelegate2::OnNonExclusiveModifyValueFailed (CCallbackArgs args)
// 被壟斷的DB Cache Client的Callback Event:
IDbCacheClientDelegate2::OnSomeoneModifyValue (CCallbackArgs& args)
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveSetValueIf</mark> : 請求比較並保存兩個值。

```cpp
// 回應:
IDbCacheClientDelegate2::OnNonExclusiveSetValueIfSuccess (CCallbackArgs args)
IDbCacheClientDelegate2::OnNonExclusiveSetValueIfFailed (CCallbackArgs args)
 
// 被壟斷的DB Cache Client的Callback Event:
IDbCacheClientDelegate2::OnSomeoneSetValue (CCallbackArgs& args)
```

## 使用DB cache時的注意事項

單方向型和請求響應型(獨家數據請求響應型\&Block型&非壟斷數據訪問)混用時的注意事項。

{% hint style="danger" %}

* 如果請求響應方法在使用期間使用單向方法，<mark style="color:orange;">Proud.IDbCacheClientDelegate2.OnAccessError</mark> 將被回饋。
* 在未收到對更改後的 Data 的響應的情況下使用單向方法可能會導致錯誤的數據進入 。
  {% endhint %}

***

## 活用

{% content-ref url="/pages/cPQ1Z5IlzKuwQISDnQuP" %}
[DB Cache 活用法](/proudnet.cn/proudnet/db_system/db_cache_ver2/using/usage.md)
{% endcontent-ref %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.proudnet.com/proudnet.cn/proudnet/db_system/db_cache_ver2/using.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
