在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    Java嵌入數(shù)據(jù)處理引擎:SQLite的挑戰(zhàn)者esProc SPL

    很多免費(fèi)開源數(shù)據(jù)處理引擎都可以嵌入 Java 應(yīng)用中,其中 SQLite 歷史悠久、用戶眾多;后起之秀 esProc SPL 功能也較強(qiáng),下面對兩者進(jìn)行多方面的比較。

    基本特征

    語言風(fēng)格

    SQLite 使用傳統(tǒng)的 SQL 代碼(兩者在本文等價),SQL 在業(yè)界很流行,不必更多介紹。SPL 是現(xiàn)代的數(shù)據(jù)計算語言,屬于簡化的面向?qū)ο蟮恼Z言風(fēng)格,有對象的概念,可以用點(diǎn)號訪問屬性并進(jìn)行多步驟計算,但沒有繼承重載這些內(nèi)容,不算徹底的面向?qū)ο笳Z言。

    運(yùn)行模式

    SQLite 是用 C 語言開發(fā)的跨平臺小型數(shù)據(jù)庫,可嵌入其他開發(fā)語言,也可在單機(jī)執(zhí)行。SPL 是用 Java 開發(fā)的跨平臺的數(shù)據(jù)計算語言,可嵌入 Java,可在單機(jī)執(zhí)行,可以數(shù)據(jù)計算服務(wù)的形式被遠(yuǎn)程調(diào)用。兩者的代碼都是解釋執(zhí)行的。

    IDE

    SQLite 官方只提供了命令行工具,圖形化工具要由第三方提供,但由于 SQL 的特性,這些工具大都沒有斷點(diǎn)調(diào)試、變量觀察等基本的 IDE 功能。SPL 提供了圖形化 IDE,包括完整的調(diào)試功能、表格形式的變量觀察功能。

    學(xué)習(xí)難度

    SQL 歷史悠久資料豐富,入門學(xué)習(xí)時難度較低,但復(fù)雜運(yùn)算時難度很大。而且,SQL 缺乏流程處理能力(分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)),要借助 Java 的相關(guān)功能才能實(shí)現(xiàn)完整的業(yè)務(wù)邏輯,所以通常還要學(xué)習(xí) Java。

    SPL 的目標(biāo)是簡化 Java 和 SQL 的編碼,刻意簡化了許多概念,學(xué)習(xí)難度較低。SPL 兼具結(jié)構(gòu)化數(shù)據(jù)計算能力和流程處理能力,可以實(shí)現(xiàn)完整的業(yè)務(wù)邏輯,不必借助其他語言。

    代碼量

    SQL 進(jìn)行簡單計算時代碼量很低,如果遇到較復(fù)雜計算,代碼量會急劇增長。SQL 經(jīng)常要用 Java 配合實(shí)現(xiàn)完整的業(yè)務(wù)邏輯,Java 的流程處理功能沒有為結(jié)構(gòu)化數(shù)據(jù)對象做優(yōu)化,代碼通常較繁瑣。

    SPL 是現(xiàn)代計算語言,避免了 SQL 的諸多弱點(diǎn),無論簡單還是復(fù)雜計算,代碼量都很低。SPL 的流程處理功能為結(jié)構(gòu)化數(shù)據(jù)對象做了優(yōu)化,相關(guān)代碼更加簡單。

    數(shù)據(jù)源讀取

    自有數(shù)據(jù)格式

    SQLite 有自有(私有)數(shù)據(jù)格式,即庫文件,一個庫文件包含多個表??梢杂妹钚忻罨?API(JDBC URL)創(chuàng)建庫文件,但不能用 SQL 代碼直接創(chuàng)建庫文件。比如,用 Java 新建一個 SQLite 庫文件,如果已存在則打開庫文件

    Class.forName(“org.sqlite.JDBC”);Connection conn = DriverManager.getConnection(“jdbc:sqlite: d:/ex1.db”);

    SPL 有兩種自有數(shù)據(jù)格式,其中一種是組表文件,專用于大數(shù)據(jù)高性能計算,不是本文重點(diǎn);另一種是集文件,專用于中小數(shù)據(jù)量和嵌入式計算。SPL 不需要建庫,也沒有庫的概念,每個集文件對應(yīng)一個表。

    外部數(shù)據(jù)源

    SQLite 只支持文本數(shù)據(jù)文件,包括 TAB 分隔的 txt、逗號分隔的 csv,也可自定義其它分隔符。

    SPL 支持多種數(shù)據(jù)源,包括:

    • JDBC(即所有的 RDB)
    • csv、TXT、JSON、XML、Excel
    • HBase、HDFS、Hive、Spark
    • Restful、WebService、Webcrawl
    • Elasticsearch、MongoDB、Kafka、R2dbc、FTP
    • Cassandra、DynamoDB、influxDB、Redis、SAP

    這些數(shù)據(jù)源都可以直接使用,非常方便。對于其他未列入的數(shù)據(jù)源,SPL 也提供了接口規(guī)范,只要按規(guī)范輸出為 SPL 的結(jié)構(gòu)化數(shù)據(jù)對象,就可以進(jìn)行后續(xù)計算。

    訪問自有數(shù)據(jù)格式

    SQLite 通過 SQL 訪問庫文件中的表,生成 SQL 結(jié)果集,即內(nèi)存中的結(jié)構(gòu)化數(shù)據(jù)對象。讀取表時一般伴隨著查詢:

    select * from Orders where Amount>2000 and Amount<=3000

    SPL 通過 SPL 的 T 函數(shù)或 import 函數(shù)讀取集文件,生成序表(相當(dāng)于 SQL 結(jié)果集)。等價的代碼:

    T(“d:/Orders.btx”).select(Amount>2000 && Amount<=3000)

    讀取 csv 文件

    SQLite 讀取 csv 文件需要三步,第一步:進(jìn)入管理命令行。

    #在Windows命令行,打開或新建名為dbname的數(shù)據(jù)庫sqlite3.exe new.db

    第二步,在管理命令行新建庫表,并導(dǎo)入數(shù)據(jù):

    #當(dāng)字段類型都是字符串時,不必手工建表。create table Orders(OrderID int,Client varchar(100),SellerID int,Amount float,OrderDate date);.import –csv d:/Orders.csv Orders

    第三步,在 Java 代碼中嵌入 SQL 查詢代碼:

    select * from Orders where Amount>2000 and Amount<=3000

    上面的方法需要人工參與,比較繁瑣。也可以全部用 Java 代碼實(shí)現(xiàn),第一步,先在操作系統(tǒng)建立一個文本文件(比如 importOrders.txt),內(nèi)容即上面第二步。

    第二步,在 Java 代碼調(diào)用操作系統(tǒng)命令行,即用 Runtime.getRuntime().exec(…) 執(zhí)行命令:

    sqlite3.exe dbname.db < importOrders.txt

    第三步不變。

    這種方法需要額外的操作系統(tǒng)執(zhí)行權(quán)限,安全風(fēng)險比較大。如果想降低安全風(fēng)險,就要用循環(huán)語句執(zhí)行 SQL 一條條插入記錄,代碼冗長,修改麻煩。

    SPL 讀取 csv 文件,只需一步,在 Java 里嵌入下面的 SPL 代碼:

    T(“d:/Orders.csv”).select(Amount>2000 && Amount<=3000)

    函數(shù) T 不僅可以讀取集文件,也可以讀取 csv 文件,并生成序表。序表是 SPL 的結(jié)構(gòu)化數(shù)據(jù)對象,可類比為 SQL 結(jié)果集。SPL 導(dǎo)入數(shù)據(jù)時,數(shù)據(jù)類型會自動解析,不必手工指定。整個過程無需人工參與,權(quán)限要求低,代碼簡短,比 SQLite 方便多了。

    如果 csv 格式不規(guī)范,還可以使用 import 函數(shù)指定分隔符、字段類型、跳過行數(shù),并處理轉(zhuǎn)義符、引號、括號等,比 SQLite 提供的功能豐富多了。

    對于 csv 之外的數(shù)據(jù)源,SQLite 都沒有提供方便的導(dǎo)入方法,取數(shù)過程非常繁瑣,而 SPL 支持多種數(shù)據(jù)源,取數(shù)過程簡單方便,可以顯著提高開發(fā)效率。

    讀取多層結(jié)構(gòu)數(shù)據(jù)

    Json 和 XML 是常用的多層結(jié)構(gòu)數(shù)據(jù)。SQLite 架構(gòu)簡單,又有 Json 計算能力,有時會承擔(dān) Json 文件 /RESTful 的計算功能,但 SQLite 不能直接解析 Json 文件 /RESTful,需要用 Java 代碼硬寫,或借助第三方類庫,最后再拼成 insert 語句插入數(shù)據(jù)表,代碼非常繁瑣,這里就不展示了。

    SPL 架構(gòu)同樣簡單,且可以直接解析 Json 文件 /RESTful,可以大幅簡化代碼,比如:

    json(file(“d:/xml/emp_orders.json”).read()).select(Amount>2000 && Amount2000 && Amount<=3000)

    SQLite 沒有 XML 計算能力,也不能直接解析 XML 文件 /WebService,只能借助外部 Java 代碼解析計算,非常繁瑣。

    SPL 可以直接讀取 XML 文件:

    A

    1

    =file(“d:/xml/emp_orders.xml”).read()

    2

    =xml(A1,”xml/row”)

    3

    =A2.select(Amount>1000 && Amount<=2000 && like@c(Client,"*business*"))

    也可以方便地讀取 WebService:

    A

    1

    =ws_client(“http://127.0.0.1:6868/ws/RQWebService.asmx?wsdl”)

    2

    =ws_call(A1,”RQWebService”:”RQWebServiceSoap”:”getEmp_orders”)

    3

    =A2.select(Amount>1000 && Amount<=2000 && like@c(Client,"*business*"))

    SPL 序表支持多層結(jié)構(gòu)數(shù)據(jù),比 SQL 庫表的二維結(jié)構(gòu)更容易表達(dá) Json/XML,計算代碼也更簡單。這部分內(nèi)容不是本文重點(diǎn),就此略過。

    跨源計算

    SQLite 的外部數(shù)據(jù)源只支持 csv 文件,跨源計算就是 csv 文件和庫表間的關(guān)聯(lián)、交集、子查詢等計算。SQL 是封閉的計算語言,不能直接計算庫外數(shù)據(jù),需要經(jīng)過一個入庫的過程,把 csv 文件變成庫表之后才能進(jìn)行跨源計算。參考前面的代碼可知,入庫的過程比較麻煩,不能只用 SQL,還要借助 Java 或命令行。

    SPL 開放性較好,可以直接計算多種數(shù)據(jù)源,數(shù)據(jù)源之間可以方便地進(jìn)行跨源計算。比如 csv 和 RESTful 左關(guān)聯(lián):

    =join@1(json(httpfile(“http://127.0.0.1:6868/api/orders”).read()):o,SellerId; T(“d:/Emp.csv”):e,EId)

    寫成多步驟的形式更易讀:

    A

    1

    =Orders=json(httpfile(“http://127.0.0.1:6868/api/orders”).read())

    2

    =Employees=T(“d:/Emp.csv”)

    3

    =join@1(Orders:o,SellerId;Employees:e,EId)

    只用 SPL 語言就可以實(shí)現(xiàn)跨源計算,不必借助 Java 或命令行,代碼簡短易懂,比 SQL 的開發(fā)效率高得多。

    數(shù)據(jù)計算

    基礎(chǔ)計算

    SQLite 支持常見的基礎(chǔ)計算:

    #選出部分字段select Client,Amount from Orders#模糊查詢select * from Orders where Amount>1000 and Client like ‘%s%’#排序select * from Orders order by Client, Amount desc#去重select distinct Client from Orders#分組匯總select strftime(‘%Y’,OrderDate) as y, Client, sum(Amount) as amt from Orders group by strftime(‘%Y’,OrderDate), Client having amt>3000#并集select * from Orders9 where Amount>3000 union select * from Orders9 where strftime(‘%Y’,OrderDate)=’2009′;#子查詢select * from (select strftime(‘%Y’,OrderDate) as y, Client, sum(Amount) as amt from Orders group by strftime(‘%Y’,OrderDate), Client) where Client like ‘%s%’;

    SPL 實(shí)現(xiàn)常見的基礎(chǔ)計算:

    A

    B

    1

    =Orders.new(Client,Amount)

    // 選出部分字段

    2

    =Orders.select(Amount>1000 && like(Client,”*s*”))

    // 模糊查詢

    3

    = Orders.sort(Client,-Amount)

    // 排序

    4

    = Orders.id(Client)

    // 去重

    5

    =Orders.groups(year(OrderDate):y,Client;sum(Amount):amt).select(amt>3000)

    // 分組匯總

    6

    =[Orders.select(Amount>3000),A1.select(year(OrderDate)==2009)].union()

    // 并集

    7

    =Orders.groups(year(OrderDate):y,Client;sum(Amount):amt).select(like(Client,”*s*”))

    // 子查詢

    SQLite 和 SPL 都有豐富的函數(shù)進(jìn)行基礎(chǔ)計算,學(xué)習(xí)掌握都不難。

    綜合計算

    先看簡單些的,計算 TopN,SQLite:

    select * from Orders order by Amount limit 3

    SQLite 代碼簡短,但因?yàn)椴恢С?top 函數(shù),也不支持序號偽列(比如 Oracle 的 rownum),只能改用 limit 實(shí)現(xiàn),理解起來不夠直觀。

    SPL 實(shí)現(xiàn) TopN:

    Orders.top(3;Amount)

    SPL 支持真正的行號,也支持 top 函數(shù),代碼更短,且易于理解。

    組內(nèi) TopN,SQLite:

    select * from (select *, row_number() over (partition by Client order by Amount) as row_number from Orders) where row_number<=3

    SQL 代碼略顯復(fù)雜,主要因?yàn)?SQLite 不支持 top 函數(shù),而 limit 函數(shù)只能限制總記錄數(shù),不能限制各組記錄數(shù),這種情況下必須用組內(nèi)行號。SQLite 沒有真正的行號字段,要用窗口函數(shù)生成偽列再用,代碼自然復(fù)雜。事實(shí)上,缺乏行號并非 SQLite 自身的問題,而是整個 SQL 體系的問題,其他數(shù)據(jù)庫也沒有行號。

    SPL 實(shí)現(xiàn)組內(nèi) TopN:

    Orders.group(Client).(~.top(3;Amount)).conj()

    SPL 代碼簡單多了,而且很好理解,先按 Client 分組,再對各組(即符號 ~)計算 TopN,最后合并各組的計算結(jié)果。SPL 之所以代碼簡單,表面上是因?yàn)橹苯又С?Top 函數(shù),本質(zhì)是因?yàn)?SPL 有真正的行號字段,或者說,SPL 支持有序集合。SPL 代碼簡單,還因?yàn)榧匣訌氐祝梢詫?shí)現(xiàn)真正的分組,即只分組不匯總,這就可以直觀地計算組內(nèi)數(shù)據(jù)。SQL 集合化不徹底,分組時必須匯總,不能直觀地計算組內(nèi)數(shù)據(jù),只能借助窗口函數(shù)。

    再看復(fù)雜些的計算,某支股票的最大連續(xù)上漲天數(shù),SQLite:

    select max(continuousdays)from (select count(*) continuousdaysfrom (select sum(risingflag) over (order by day) norisingdaysfrom (select day, case when price>lag(price) over (order by day) then 0 else 1 end risingflag from tbl)) group by norisingdays)

    上面代碼冗長復(fù)雜。SQL 很難直接表達(dá)連續(xù)上漲的概念,只能換個方法變相實(shí)現(xiàn),即通過累計不漲天數(shù)來計算連續(xù)上漲天數(shù),這種方法技巧性強(qiáng),編寫難度大且不易理解。而且,SQL 難以調(diào)試,導(dǎo)致維護(hù)困難。

    SPL 求最大連續(xù)上漲天數(shù):

    A

    1

    =tbl.sort(day)

    2

    =t=0,A1.max(t=if(price>price[-1],t+1,0))

    上面代碼簡單多了。SPL 容易表達(dá)連續(xù)上漲的概念,先按日期排序;再遍歷記錄,發(fā)現(xiàn)上漲則計數(shù)器加 1。這里既用到了循環(huán)函數(shù) max,也用到了有序集合,代碼中 [-1] 表示上一條,是相對位置的表示方法,price[-1]表示上一個交易日的股價,比整體移行(lag 函數(shù))更直觀。

    找出銷售額占到一半的前 n 個客戶,并按銷售額從大到小排序。SQLite:

    with A as(select client,amount,row_number() over (order by amount) ranknumberfrom sales)select client,amountfrom (select client,amount,sum(amount) over (order by ranknumber) accfrom A)where acc>(select sum(amount)/2 from sales)order by amount des

    上面代碼復(fù)雜。SQL 很難處理恰好要過線的客戶,只能換個方法變相實(shí)現(xiàn),即計算銷售額從小到大的累計值,反過來找出累計值不在后一半的客戶。這種方法技巧性強(qiáng),代碼冗長,而且難以調(diào)試。

    SPL 求銷售額占到一半的前 n 個客戶:

    A

    B

    2

    =sales.sort(amount:-1)

    /銷售額逆序排序,可在SQL中完成

    3

    =A2.cumulate(amount)

    /計算累計序列

    4

    =A3.m(-1)/2

    /最后的累計即總額

    5

    =A3.pselect(~>=A4)

    /超過一半的位置

    6

    =A2(to(A5))

    /按位置取值

    上面代碼相對簡單。SPL 集合化成更徹底,可以用變量方便地表達(dá)集合,并在下一步用變量引用集合繼續(xù)計算,因此特別適合多步驟計算。將大問題分解為多個小步驟,可以方便地實(shí)現(xiàn)復(fù)雜的計算目標(biāo),代碼不僅簡短,而且易于理解。此外,多步驟計算天然支持調(diào)試,無形中提高了開發(fā)效率。

    從上面例子可以看出,SQL 只適合較簡單的計算,而 SPL 支持有序集合,集合化更徹底,從簡單到復(fù)雜的計算都可以很好的完成。此外,SPL 還支持游離記錄,可以用點(diǎn)號直觀地引用關(guān)聯(lián)表,從而簡化復(fù)雜的關(guān)聯(lián)計算。

    日期和字符串函數(shù)。SQLite 支持日期和字符串函數(shù),比如日期增減、截取字符串等,但還不夠豐富,很多常用函數(shù)并不直接支持,比如季度增減、工作日計算等。

    SPL 提供了更豐富的日期和字符串函數(shù),在數(shù)量和功能上遠(yuǎn)遠(yuǎn)超過了 SOLite。比如:

    季度增減:elapse@q(“2020-02-27”,-3) //返回2019-05-27N個工作日之后的日期:workday(date(“2022-01-01”),25) //返回2022-02-04判斷是否全為數(shù)字:isdigit(“12345”) //返回true取子串前面的字符串:substr@l(“abCDcdef”,”cd”) //返回abCD按豎線拆成字符串?dāng)?shù)組:”aa|bb|cc”.split(“|”) //返回[“aa”,”bb”,”cc”]

    SPL 還支持年份增減、求季度、按正則表達(dá)式拆分字符串、拆出 SQL 的 where 或 select 部分、拆出單詞、按標(biāo)記拆 HTML 等大量函數(shù)。

    SPL 函數(shù)選項和層次參數(shù)

    值得一提的是,為了進(jìn)一步提高開發(fā)效率,SPL 還提供了獨(dú)特的函數(shù)語法。

    有大量功能類似的函數(shù)時,SQL 要用不同的名字或者參數(shù)進(jìn)行區(qū)分,使用不太方便。而 SPL 提供了非常獨(dú)特的函數(shù)選項,使功能相似的函數(shù)可以共用一個函數(shù)名,只用函數(shù)選項區(qū)分差別。比如,select 函數(shù)的基本功能是過濾,如果只過濾出符合條件的第 1 條記錄,可使用選項 @1:

    T.select@1(Amount>1000)

    對有序數(shù)據(jù)用二分法進(jìn)行快速過濾,使用 @b:

    T.select@b(Amount>1000)

    函數(shù)選項還可以組合搭配,比如:

    Orders.select@1b(Amount>1000)

    結(jié)構(gòu)化運(yùn)算函數(shù)的參數(shù)有些很復(fù)雜,SQL 需要用各種關(guān)鍵字把一條語句的參數(shù)分隔成多個組,但這會動用很多關(guān)鍵字,也使語句結(jié)構(gòu)不統(tǒng)一。SPL 使用層次參數(shù)簡化了復(fù)雜參數(shù)的表達(dá),即通過分號、逗號、冒號自高而低將參數(shù)分為三層:

    join(Orders:o,SellerId ; Employees:e,EId)

    數(shù)據(jù)持久化

    SQLite 通過直接處理庫表來實(shí)現(xiàn)數(shù)據(jù)持久化,分為增、改、刪三種:

    insert into Orders values(201,’DSL’,10,2000.0,’2019-01-01′)update Orders set Client=’IBM’ where orderID=201delete from Orders where orderID=201

    批量新增是常見的需求,SQLite 代碼如下:

    insert into Orders(OrderID,Client,SellerID,Amount,OrderDate) select 201,’DSL’,10,2000.0,’2019-01-01’union allselect 202,’IBM’,10,3000.0,’2019-01-01′

    SPL 集文件的持久化有兩種方式。第一種方式:直接處理集文件,可實(shí)現(xiàn)記錄新增(及批量新增)。比如:

    A

    1

    =create(OrderID,Client,SellerID,Amount,OrderDate)

    2

    =A1.record([201,”HDR”,9,2100.0,date(“2021-01-01″),202,”IBM”,9,1900,date(“2021-01-02”)])

    3

    =file(“d:/Orders.btx”).export@ab(A2)

    第二種方式:先處理內(nèi)存里的序表,再將序表覆蓋寫入原來的集文件。這種方式可實(shí)現(xiàn)增、改、刪。只要將上面 A3 格里的 export@ab 改為 export@b 即可,@a 表示追加,@b 表示集文件格式。這種方式性能不如 SQLite,但嵌入計算的數(shù)據(jù)量普遍不大,覆寫的速度通??山邮?。

    SPL 組表支持高性能增刪改,適用于大數(shù)據(jù)量高性能計算,不是本文重點(diǎn)。

    SQLite 只支持庫表的持久化,不支持其他數(shù)據(jù)源,包括 csv 文件,硬要實(shí)現(xiàn)的話只能借助 Java 硬編碼或第三方類庫,代碼非常繁瑣。

    SPL除了支持集文件的持久化,也支持其他數(shù)據(jù)源,同樣是通過序表為媒介。

    file(“d:/Orders.csv”).export@t(A2) //csv文件file(“d:/Orders.xlsx”).xlsexport@t(A2) //xls文件file(“d:/Orders.json”).write(json(A2)) //json文件

    特別地,SPL 支持任意數(shù)據(jù)庫的持久化。比如:

    A

    B

    1

    =connect(“orcl”)

    /連接外部 oracle

    2

    =T=A1.query(“select * from salesR where SellerID=?”,10)

    /批量查詢,序表 T

    3

    =NT=T.derive()

    /復(fù)制出新序表 NT

    4

    =NT.field(“SELLERID”,9)

    /批量修改新序表

    5

    =A1.update(NT:T,sales;ORDERID)

    /持久化

    數(shù)據(jù)庫的持久化依然以序表為媒介,可以明顯看出這種方式的優(yōu)點(diǎn):函數(shù) update 自動比對修改(增改刪)前后的序表,可方便地實(shí)現(xiàn)批量數(shù)據(jù)地持久化。

    流程處理

    SQLite 缺乏流程處理能力,無法實(shí)現(xiàn)完整的業(yè)務(wù)邏輯,只能將 SQL 數(shù)據(jù)對象轉(zhuǎn)為 Java 的 resultSet/List,再用 for/if 語句處理流程,最后再轉(zhuǎn)回 SQL 的數(shù)據(jù)對象,代碼非常繁瑣。復(fù)雜的業(yè)務(wù)邏輯要在 SQL 對象和 Java 對象之間轉(zhuǎn)換多次,更加麻煩。

    SPL 提供了流程控制語句,配合內(nèi)置的結(jié)構(gòu)化數(shù)據(jù)對象,可以方便地實(shí)現(xiàn)各類業(yè)務(wù)邏輯。

    分支結(jié)構(gòu):

    一個

    2

    3

    if T.AMOUNT>10000

    =T.BONUS=T.AMOUNT*0.05

    4

    else if T.AMOUNT>=5000 && T.AMOUNT<10000

    =T.BONUS=T.AMOUNT*0.03

    5

    else if T.AMOUNT>=2000 && T.AMOUNT<5000

    =T.BONUS=T.AMOUNT*0.02

    循環(huán)結(jié)構(gòu):

    一個

    1

    =db=connect(“db”)

    2

    =T=db.query@x(“select * from sales where SellerID=? order by OrderDate”,9)

    3

    for T

    =A3.BONUS=A3.BONUS+A3.AMOUNT*0.01

    4

    =A3.CLIENT=CONCAT(LEFT(A3.CLIENT,4), “co.,ltd.”)

    5

    上述代碼之外,SPL 還有更多針對結(jié)構(gòu)化數(shù)據(jù)的流程處理功能,可進(jìn)一步提高開發(fā)效率,比如:每輪循環(huán)取一批而不是一條記錄;某字段值變化時循環(huán)一輪。

    應(yīng)用結(jié)構(gòu)

    Java 集成

    SQLite 提供了 JDBC 接口,可以被 Java 代碼方便地集成:

    Class.forName(“org.sqlite.JDBC”);Connection conn = DriverManager.getConnection(“jdbc:sqlite: d:/ex1.db”);Statement statement = conn.createStatement();ResultSet results = statement.executeQuery(“select * from Orders where Amount>1000 and Client like ‘%s%'”);

    SQLite 的內(nèi)核是 C 語言編寫的,雖然可以被集成到 Java 應(yīng)用中,但不能無縫集成,和 Java 主程序交換數(shù)據(jù)時要耗費(fèi)額外的時間,在數(shù)據(jù)量較大或交互較頻繁時性能就會明顯下降。同樣因?yàn)閮?nèi)核是 C 程序,SQLite 會在一定程度上破壞 Java 架構(gòu)的一致性和健壯性。

    SPL 同樣提供了 JDBC 接口,集成方法和 SQLite 類似:

    Class.forName(“com.esproc.jdbc.InternalDriver”);Connection conn =DriverManager.getConnection(“jdbc:esproc:local://”);Statement statement = conn.createStatement();ResultSet result = statement.executeQuery(“=T(“D:/Orders.csv”).select(Amount>1000 && like(Client,”*s*”))”);

    SPL 是純 Java 編寫的,可被 Java 應(yīng)用無縫集成,架構(gòu)一致性強(qiáng),系統(tǒng)更穩(wěn)定,不需要耗費(fèi)額外時間交換數(shù)據(jù),性能更有保障。

    業(yè)務(wù)邏輯外置

    一般的 RDB 支持存儲過程,可將業(yè)務(wù)邏輯外置于 Java 程序,但 SQLite 不支持存儲過程,完整的業(yè)務(wù)邏輯通常要借助 Java 的流程處理功能才能實(shí)現(xiàn),也就不能外置于 Java 程序。業(yè)務(wù)邏輯不能外置于 Java 代碼,導(dǎo)致兩者耦合性過高。

    SPL 可實(shí)現(xiàn)完整的業(yè)務(wù)邏輯,業(yè)務(wù)邏輯(或復(fù)雜的、經(jīng)常變化的計算代碼)可保存為腳本文件,并外置于 Java 程序。Java 程序以存儲過程的形式引用腳本文件名:

    Class.forName(“com.esproc.jdbc.InternalDriver”);Connection conn =DriverManager.getConnection(“jdbc:esproc:local://”);CallableStatement statement = conn.prepareCall(“{call queryOrders()}”);statement.execute();

    外置的 SPL 腳本不僅可以有效降低系統(tǒng)耦合性,還具有熱切換的特點(diǎn)。SPL 是解釋型代碼,修改后不必編譯就可直接運(yùn)行,也不必重啟 Java 應(yīng)用,可有效降低維護(hù)成本。

    內(nèi)存計算

    SQLite 可用于內(nèi)存計算,一般在應(yīng)用啟動時將數(shù)據(jù)加載至內(nèi)存(URL 有變化):

    Connection conn= DriverManager.getConnection(“jdbc:sqlite:file::memory:?cache=shared”);Statement st =conn.createStatement();st.execute(“restore from d:/ex1”);

    需要進(jìn)行業(yè)務(wù)計算時,就可以直接利用之前加載好的內(nèi)存數(shù)據(jù):

    Class.forName(“org.sqlite.JDBC”);Connection conn= DriverManager.getConnection(“jdbc:sqlite:file::memory:?cache=shared”);Statement statement = conn.createStatement();ResultSet results = statement.executeQuery(“select OrderID,Client,Amount,Name,Gender Dept from Orders left join Employees on Orders.SellerId=Empoyees.EId”);

    SPL 同樣可用于內(nèi)存計算,在應(yīng)用啟動時執(zhí)行腳本,將數(shù)據(jù)加載至內(nèi)存(URL 不變):

    A

    1

    = connect(“orcl”).query@x(“select OrderID,Client,SellerID,OrderDate,Amount from orders order by OrderID”)

    2

    >env(Orders,A1)

    3

    >env(Employees,T(“d:/Employees.csv”))

    需要進(jìn)行業(yè)務(wù)計算時,可直接利用之前加載好的內(nèi)存數(shù)據(jù):

    Class.forName(“com.esproc.jdbc.InternalDriver”);Connection conn =DriverManager.getConnection(“jdbc:esproc:local://”);Statement statement = conn.createStatement();ResultSet result = statement.executeQuery(“=join@1(Orders:O,SellerId; Employees:E,EId).new(O.OrderID, O.Client,O.Amount,E.Name,E.Gender,E.Dept)”);

    關(guān)聯(lián)計算如果頻繁發(fā)生,性能必然下降,改用寬表的話又太占內(nèi)存,SQL 沒有好辦法解決這個問題。SPL 獨(dú)有預(yù)關(guān)聯(lián)技術(shù),可大幅提升關(guān)聯(lián)計算的性能,且不占用額外內(nèi)存。SPL 還有更多內(nèi)存計算技術(shù),通常比 SQLite 性能好得多,包括并行計算、指針式復(fù)用、內(nèi)存壓縮等。

    SQLite 可以方便地嵌入 Java,但數(shù)據(jù)源加載繁瑣,計算能力不足,無法獨(dú)立完成業(yè)務(wù)邏輯,架構(gòu)上弱點(diǎn)頗多。SPL 也很容易嵌入 Java,且直接支持更多數(shù)據(jù)源,計算能力更強(qiáng),流程處理方便,可獨(dú)立實(shí)現(xiàn)業(yè)務(wù)邏輯。SPL 還提供了多種優(yōu)化體系結(jié)構(gòu)的手段,代碼既可外置也可內(nèi)置于 Java,支持解釋執(zhí)行和熱切換,可進(jìn)行高性能內(nèi)存計算。

    SPL下載地址:http://c.raqsoft.com.cn/article/1595816810031

    SPL開源地址:https://github.com/SPLWare/esProc

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
    上一篇 2022年8月7日 19:06
    下一篇 2022年8月7日 19:06

    相關(guān)推薦

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息