slot deposit pulsa slot mahjong slot gacor slot gacor slot gacor resmi slot gacor 2025 slot gacor terpercaya slot gacor 2025 slot gacor hari ini slot gacor hari ini slot gacor hari ini
SQLite 的挑战者
17611538698
webmaster@21cto.com

SQLite 的挑战者

数据库 0 1292 2023-12-15 09:46:57

图片

很多小微型应用程序需要一些数据处理和计算能力,如果集成一个数据库就显得太沉重了,小巧轻量的 SQLite 是个不错的选择,因而被开发者广泛应用。

不过,SQLite 也有些不方便的地方。SQLite 对外部数据文件及其它数据源的支持力度比较弱又很繁琐;它本身没有存储过程,需要用主程序配合来实现流程,这会导致经常和主程序交换数据(流程走向依赖于数据),效率低且代码麻烦;复杂些的运算用 SQL 也很难写,开发效率较低。

而现在,用 esProc SPL 可以解决这一切。

esProc 是纯 Java 开发,把 jar 包直接引入到 Java 应用程序中就可以使用了,完全无缝集成。

esProc 也提供了标准 JDBC 接口,就像访问数据库一样可以被 Java 主程序调用,只不过 esProc 使用的查询语言称为 SPL,而不是 SQL。

Class.forName("com.esproc.jdbc.InternalDriver");Connection conn =DriverManager.getConnection("jdbc:esproc:local://");Statement statement = conn.createStatement();ResultSet result = statement.executeQuery("=T(\"Orders.csv\").select(Amount>1000 && like(Client,\"*s*\")
对于复杂些的运算需求,SPL 写起来要比 SQL 简单多了。
比如:找出销售额占到一半的前 n 个客户,并按销售额从大到小排序。SQL 写出来是这样的:
with A as (select client,amount,row_number() over (order by amount) ranknumber from sales)select client,amountfrom (select client,amount,sum(amount) over (order by ranknumber) acc from A)where acc>(select sum(amount)/2 from sales)order by amount des
SQL 很难处理恰好要过线的那条记录,只能换个方法变相实现,即计算销售额从小到大的累计值,反过来找出累计值不在后一半的客户。而且 SQL 要把复杂逻辑写在一句中,即使用了 with 子句(充当中间变量)和窗口函数,仍然要嵌套,技巧性太强,也不好调试。
而 SPL 有更丰富的集合运算,也容易实现分步计算,按自然思维去写就行了:

AB
1=sales.sort(amount:-1)/ 销售额逆序排序
2=A1.cumulate(amount)/ 计算累计序列
3=A2.m(-1)/2/ 最后的累计即总额
4=A2.pselect(~>=A3)/ 超过一半的位置
5=A1(to(A4))/ 按位置取值
和大多数写成文本的程序语言不同,SPL 的代码是写在格子里的,这个帖子 写在格子里的程序语言 里有更多信息。
图片
SPL 本身就有完善的流程控制语句,像 for 循环,if 分支都不在话下,还支持子程序调用。这相当于提供了存储过程的能力,只用 SPL 就能实现非常复杂的业务逻辑,几乎不再需要主程序来配合了,主程序只是简单调用它就行了,方法也和调用数据库存储过程一样:
Class.forName("com.esproc.jdbc.InternalDriver");Connection conn =DriverManager.getConnection("jdbc:esproc:local://");CallableStatement statement = conn.prepareCall("call queryOrders()");statement.execute();

不同的是,SPL 脚本是解释执行的,在修改后就会立即生效,不像存储过程一样需要有个编译过程。特别地,这些脚本可以存放在主程序之外,改动时不需要主程序跟随重新编译部署,可以实现业务逻辑的实时热切换。如果是主程序配合数据库的 SQL 才能实现的逻辑就没有这个好处了。

SPL 支持的数据源就太丰富了。

包括各种格式的文本文件,Excel 文件, 关系数据库,NoSQL 数据库,HTTP,Kafka,…,以及 json/xml 格式的数据,反正你听说过和没听说过的数据源都被 esProc 做好了访问接口,只要简单的一两句代码就可以读写。

T("Orders.csv").select(Amount>2000 && Amount<=3000)Orders=json(httpfile("http://127.0.0.1:6868/api/orders").read())db=connect("mysql")db.query("select * from salesR where SellerID=?",10)...

访问这些外部数据时不需要事先创建表,直接读就行了,非常方便。而且,这些文件和数据源在 SPL 中都是可写的,所以可以用来做数据持久化,这样写出来的数据还可能被其它应用程序访问。

file("Orders.csv").export@t(A2)file("Orders.xlsx").xlsexport@t(A2)db.update(NewTable:OldTable)
SPL 还提供了特有的二进制格式文件,可以获得更高的读写性能。
和 SQLIte 类似,esProc 非常轻量,核心 jar 包只有 15M,完整部署也就 1G 左右,它可以在安卓上流畅运行。不过,有点遗憾的是,esProc 目前只有 Java 版本,集成进非 Java 应用程序时相对麻烦,也不能在没有成熟 JVM 环境的 iOS 上工作。
esProc免费、开源,可以在以下地址获取:

GitHub:https://github.com/SPLWare/esProc

评论