最近在瀏覽某篇有關事件流的文章時,裡面提到了資料的流處理,興趣來了,就想看看能否在android端實現乙個。
根據文章的介紹,將每次資料的變更事件,像是插入,刪除或者更新等,記為乙個不可變的事件,讓資料在事件中流淌,而不是對資料庫進行破壞性的寫入,也就是說,直接讀取資料的聚合結果就能獲取最好的效能。
事件流可以完成下面的工作:
1.獲取所有的原始事件,可能需要進行轉換,然後將它們載入到乙個大型的資料倉儲中供分析人員使用;
2.更新全文搜尋索引,使使用者可以搜尋最新的資料;
3.更新快取,使系統可以從快速快取中讀取資料,並保證快取中的資料是最新的;
4.通過對事件流進行處理建立乙個新的事件流,然後將後者作為另乙個系統的輸入。
可能帶來的好處如下:
1.松耦合:資料讀寫使用不同的資料庫模式,讀取的資料經由寫入的資料轉換而來,應用程式不同部分間的耦合度降低了;
2.讀寫效能:規範化(寫入快)和非規範化(讀取快)的爭論源於資料讀寫使用同乙個模式的假設,如果資料讀寫使用不同的資料庫模式,讀寫速度都會得到提公升;
3.擴充套件性:因為事件流是一種簡單的抽象,而且允許開發人員將應用程式分解成流的生產者和消費者,所以容易跨機器並行和擴充套件;
4.靈活性:原始事件簡單明確,模式遷移不會造成多大影響,而向使用者展示資料要複雜得多,但如果有乙個轉換過程可以實現從原始事件到快取內容的轉換,那麼當需要新的使用者介面時,只需要使用新的邏輯構建新的快取;
5.錯誤場景:原始事件
是不變的事實,如果系統出現問題,那麼開發人員總是可以用相同的順序將事件重放。
如果是這樣的設計, 編寫查詢或者規則來匹配滿足特定模式的事件,還要在流上進行全文搜尋,在流上事先註冊乙個查詢,當有事件匹配查詢時傳送通知。
由此衍生出幾個概念:
1.響應式:主要是將事件流提供給使用者介面使用;
2.變更資料捕獲:按照我們熟悉的方式使用資料庫,但要將任何插入,更新和刪除操作抽取到乙個資料變更事件流中。
初步的實現已經出來了,大概的實現如下:
1.建立資料庫和表
在assets資料夾下建立database.xml檔案,裡面配置資料庫的名字,版本號和資料庫的表:
<?xml version="1.0" encoding="utf-8"
?>
<
database
>
<
dbname
value
="zwb.db"
>
dbname
>
<
version
value
="1"
>
version
>
<
list
>
<
class
="com.zwb.args.dbpratice.model.status"
>
>
<
class
="com.zwb.args.dbpratice.model.user"
>
>
list
>
database
>
然後初始化databasecache:
databasecache cache = databasecache.getinstance(this);
2.基本使用
宣告乙個model類,繼承自basetable:
@table(table = "status")public
class status extends
basetable
public
string getname()
public
void
setstatusid(string id)
public
string getstatusid()
}
其中,@table宣告的是該model對應的表的名字,@column宣告的是該字段對應的資料庫中的型別。
如果該字段的型別和資料庫中的型別不一致,可以通過@columntype來指定型別。
3.資料插入
status status = newstatus();
status.setname("**");
status.setstatusid("01");
insertevent insertstatusevent = new
insertevent();
insertstatusevent.to(status.
class).insert(status);
4.資料更新
updateevent updateevent = newupdateevent();
updateevent.to(status.
class).where("id", "01").update("name", "你好");
5.資料查詢
liststatuslist = cache.from(status.class).where("statusid", "01").find();
這樣就是查詢status表中的statusid為01的所有記錄。當然,也可以查詢所有資料:
liststatuslist = cache.from(status.class).findall();
6.資料讀取
databasecache cache = databasecache.getinstance(this);list
statuslist = cache.readfromdb(status.class);
for(status status : statuslist)
這樣資料就會從資料庫轉移到事件流中。
7.資料儲存
databasecache cache = databasecache.getinstance(this);cache.inserttodb(status.
class);
這樣就會將和status有關的資料插入到資料庫中。
8.資料刪除
deleteevent deleteevent = newdeleteevent();
deleteevent.to(status.
class).where("id", "01").delete();
這樣就是刪除id為01的資料。
如果是刪除某個集合的全部資料,則是:
liststatuses = new arraylist();for(int i = 0; i < 10; i++)
deleteevent.to(status.
class).deleteall(statuses);
如果是刪除表的全部資料:
deleteevent.to(status.class).deleteall();
這是目前的實現,後面會有時間講解一下實現的過程,具體的專案位址放在github上:有興趣可以上去看看,順便給個星星。
運算元據庫的類 C
using system using system.data using system.data.sqlclient using microsoft.win32 using system.reflection using system.io using system.web using system...
Oracle如何運算元據的加密
oracle 應用伺服器應用程式使用 sec manager.secure package程式包中的例程儲存加密格式的私人資料 如使用 secure package.secure data儲存 card no 資料 根據create packages.sql中描述的定製加密程式包的定義,對 card...
PDO運算元據庫的方法
php與mysql的連線有三種api介面,分別是 php的mysql擴充套件 php的mysqli擴充套件 php資料物件 pdo 在這三種方法中,民間 很多是傾向於使用pdo,因為其不擔有跨庫 可以和各個資料庫連線和處理 的優點,更有讀寫速度快的特點。pdo不僅能 防止了sql注入問題,同時是物件...