面向 Java 程序员的 SQLite 替代品

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

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

如果你恰好是在用 Java 或安卓上编程,那么 esProc SPL 可能是个更好的选择,那些问题都不复存在了。

esProc 也是个免费开源的软件,在这里 https://github.com/SPLWare/esProc

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*\")

esProc 也支持使用 SQL,不需要定义元数据,直接把数据文件当表就可以:

复制代码
ResultSet result = statement.executeQuery("$SELECT * FROM Orders.csv WHERE Amount>1000 AND Client LIKE '%s%'")

不过,对于复杂些的运算需求,SPL 写起来要比 SQL 简单多了。比如我们经常举例的任务:计算一支股票最长连续上涨的天数,SQL 要写成多层嵌套,冗长且难懂:

复制代码
select max(ContinuousDays) from (
    select count(*) ContinuousDays from (
       select sum(UpDownTag) over (order by TradeDate) NoRisingDays from (
            select TradeDate,case when Price>lag(price) over ( order by TradeDate) then 0 else 1 end UpDownTag from Stock ))
    group by NoRisingDays )

SPL 提供了更多的基础函数,同样的计算逻辑,写起来要简单得多:

复制代码
Stock.sort(TradeDate).group@i(Price<Price[-1]).max(~.len())

用更自然的思路也可以(SQL 实现不了这个过程,只能绕路用上面的多层嵌套写法):

|---|----------------------------------------------------------------|
| | A |
| 1 | =cnt=0 |
| 2 | =Stock.sort(TradeDate).max(cnt=if(Price>Price[-1],cnt+1,0)) |

和大多数写成文本的程序语言不同,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 还提供了特有的二进制格式文件,可以获得更高的读写性能。

和 JVM 相比,esProc 非常轻量,核心包只有 15M,几乎可以忽略不计,在安卓上也能流畅运行。

相关推荐
是发财不是旺财9 分钟前
跟着deepseek学golang--认识golang
开发语言·后端·golang
Tech Synapse19 分钟前
人脸识别考勤系统实现教程:基于Face-Recognition、OpenCV与SQLite
人工智能·opencv·sqlite
Bruce_Liuxiaowei44 分钟前
基于Python+Flask的MCP SDK响应式文档展示系统设计与实现
开发语言·python·flask·mcp
chuxinweihui1 小时前
数据结构——栈与队列
c语言·开发语言·数据结构·学习·算法·链表
我不是程序猿儿1 小时前
[C#]反射的实战应用,实际数据模拟
开发语言·c#
wt_cs1 小时前
身份证实名认证接口数字时代的信任基石-node.js实名认证集成
开发语言·node.js·php
爱编程的鱼1 小时前
C# 结构(Struct)
开发语言·人工智能·算法·c#
只可远观2 小时前
Flutter Dart 循环语句 for while do..while break、continue
开发语言·javascript·ecmascript
吴_知遇2 小时前
【华为OD机试真题】428、连续字母长度 | 机试真题+思路参考+代码解析(E卷)(C++)
开发语言·c++·华为od
basketball6163 小时前
Python torchvision.transforms 下常用图像处理方法
开发语言·图像处理·python