A ORM formwork Rustlang-based,dynamic sql, no Runtime,No Garbage Collector, low Memory use,High Performance orm Framework.
rbatis 是一个无GC无虚拟机无运行时Runtime直接编译为机器码,并发安全的 数据库 ORM框架,并且所有数据传值均使用json(serde_json)
rbatis 使用百分之百的安全代码实现
This crate uses #![forbid(unsafe_code)] to ensure everything is implemented in 100% Safe Rust.
- 使用最通用的json数据结构(基于serde_json)进行传参和通讯
- 高性能,单线程benchmark 可轻松拉起200000 QPS/s(直接返回数据(数据库查询时间损耗0),win10,6 core i7,16GB) 多线程更高 远超go语言版本的GoMyBatis
- 多功能,乐观锁插件+逻辑删除插件+分页插件+Py风格Sql+基本的Mybatis功能
- 支持future,async await(理论上,假设严格按照async_std库替代所有io操作,那么并发量可远远超过go语言)
- 日志支持,可自定义具体日志(基于标准库log(独立于任何特定的日志记录库),日志可选任意第三方库实现)
- 使用百分百的安全代码实现(lib.rs加入了#![forbid(unsafe_code)] 禁止不安全代码)
- 点击查看-示例代码
首先(Cargo.toml)添加项目依赖
# add this library,and cargo install
rbatis = "*"
py风格sql语法Example
// 。
= *
= #{name}
= #{delete_flag}
= 2
= 3
:
= #{delete_flag}
= ; : <> = ::
;
日志系统(这里举例使用fast_log)
//main函数加入
use ;
xml代码Example
<= #{endTime}
order by create_time desc
limit #{page}, #{size}
select * from biz_activity
and name like #{pattern}
and create_time >= #{startTime}
and create_time
Cargo.toml 加入以下代码
[]
= "*"
= "0.4"
="1.0.2"
简单使用
use Rbatis;
use RbatisError;
xml使用方法
use crate Rbatis;
use ;
/**
* 数据库表模型
*/
//输出结果
//2020-01-10T10:28:54.437167+08:00 INFO rbatis::core::rbatis - [rbatis] Query ==> Example_ActivityMapper.xml.select_by_condition: select * from biz_activity order by create_time desc
//2020-01-10T10:28:54.437306+08:00 INFO rbatis::core::rbatis - [rbatis][args] ==> Example_ActivityMapper.xml.select_by_condition:
//2020-01-10T10:28:54.552097+08:00 INFO rbatis::core::rbatis - [rbatis] ReturnRows <== 2
//[rbatis] result==> [Activity { id: Some("\"dfbdd779-5f70-4b8f-9921-a235a9c75b69\""), name: Some("\"新人专享\""), version: Some(6) }, Activity { id: Some("\"dfbdd779-5f70-4b8f-9921-c235a9c75b69\""), name: Some("\"新人专享\""), version: Some(6) }]
事务支持
//自定义事务
//声明式事务
Web框架支持(这里举例actix-web,不支持tokio的框架使用 默认方法,支持tokio的使用async_* 开头的方法)
//这里举例使用web排行榜屠榜最快的actix-web
use rbatis_macro;
async
async
支持数据库类型√已支持.进行中
数据库 | 已支持 |
---|---|
Mysql | √ |
Postgres | √ |
TiDB | √ |
CockroachDB | √ |
进度表-按照顺序实现
功能 | 已支持 |
---|---|
CRUD(内置CRUD模板(内置CRUD支持乐观锁/逻辑删除)) | √ |
LogSystem(日志组件) | √ |
LogicDelPlugin(逻辑删除插件) | √ |
VersionLockPlugin(乐观锁插件,防止并发修改数据) | √ |
PagePlugin(分页插件) | √ |
Tx(事务/事务嵌套/注解声明式事务) | √ |
Py(在SQL中使用和xml等价的类python语法) | √ |
SlowSqlCount(内置慢查询日志分析) | √ |
async/await支持(actix/actix-web,hyper等等兼容Tokio的web框架) | √ |
DataBaseConvertPlugin(数据库表结构转换为配置插件) | x |
web(可视化Web UI) | x |
基准测试benchmark (测试平台 win10,6 core i7,16GB)
分步骤压测
//sql构建性能 Example_ActivityMapper.xml -> select_by_condition
操作/纳秒nano/op: 0.202 s,each:2020 nano/op
事务数/秒 TPS: 495049.50495049503 TPS/s
//查询结果解码性能 decode/mysql_json_decoder -> bench_decode_mysql_json
操作/纳秒nano/op: 0.24 s,each:2400 nano/op
事务数/秒 TPS: 416666.6666666667 TPS/s
//综合性能约等于
操作/纳秒nano/op: 4420 nano/op
事务数/秒 TPS: 200000 TPS/s
- 结论: 假设IO耗时为0的情况下,仅单线程 便有高达20万QPS/TPS,性能也是go语言版、java版 等等有GC暂停语言的 几倍以上性能
常见问题
- async await支持?
请参考使用adapter包,使用async_开头的方法支持异步操作
- postgres 的stmt使用$1,$2而不是mysql的?,那么是否需要特殊处理?
不需要,因为rbatis旗下 rbatis_driver 已经处理了 ? -> $1的转换,你只需要在sql中写?即可。
- oracle数据库驱动支持?
不支持,应该坚持去IOE