Lealone 5.2.0 GA
Lealone 5.2 是一个长期支持(LTS) 且具有里程碑意义的大版本。
bug fix
-
如果执行 insert 语句时执行 prepared 类型的 select 语句,
当 select 语句让出执行权时可能会导致 insert 语句被执行两次 -
对于无主键的表如果存在索引,在多个线程写索引时可能导致索引 key 指向的 row id 是 0
-
如果保存数据的过程中有新的事务进来,不能增加 checkpoint,否则断电时会导致数据丢失
-
在手动提交模式下,当执行语句失败时如果没有手工回滚就直接执行下一条语句会被挂起
-
当新事务提交更新后,在旧的 REPEATABLE_READ 事务下执行更新语句会导致更新丢失问题
-
在自动提交模式下,嵌套执行的 sql 语句不应该提前提交事务
-
调度器在一个事务中先执行一条 sql,然后再执行 select,如果给其他事务让出执行权后 select 会被挂起
-
Issue #177 在聚合函数中使用 case 表达式会出现类型错误
-
Issue #180 在 shell 脚本中$@需要加上双引号才能把命令行中带双引号的字符串当成一个整体处理
-
Issue #190 保存 RemovedPages 时使用一个拷贝,避免产生 ConcurrentModificationException
-
Issue #196 存在多个事务时,执行不带 where 条件的 count(*) 可能产生 NPE
improvement
-
执行 shutdown server 语句需要 lealone database 的 admin 权限
-
初始化数据库时把表的版本号也初始化了,避免在执行 insert/update 时用同步的方式加载表的版本号
-
只允许一个线程初始化数据库,其他线程异步等待,但是不会挂起
-
使用 ConcurrentHashMap 实现 UniqueHashIndex,支持多线程并发读写
-
每条记录在内存中不再需要包装成一个 ValueArray 对象,能节省5个字节的内存大小
-
二级索引的 Key 由 ValueArray 类型变成 IndexKey 类型,能节省5个字节的内存大小
-
不再需要 btree page 缓存,会自动根据内存使用情况动态回收 btree page 占用的内存空间
-
修改记录时,如果存在可重复读的事务并且记录的历史版本足够这些事务使用了,那就不必再把记录的旧值加到历史版本链表里了
-
执行 checkpoint 分两步进行,每一步只需要放一条 checkpoint log 到 log sync 线程的队列即可,无需等待
-
优化 sequence 的实现,并且事务回滚时可以退回到之前的值
-
事务提交时,无需把被更新的记录 put 回 btree map 中,标记一下脏页即可
-
只要 chunk 文件的大小没有超过 chunk_max_size,脏页数据会一直 append 到最新的 chunk 文件
-
优化IN(SELECT)语句,避免每次都查询 Issue #189
-
数据库重新启动或网络断开后 lealone 命令行客户端会自动重连
-
创建索引的过程中不再需要创建多个临时 btree map
new features
-
执行 checkpoint 时会把老的 redo log 文件归档
-
支持在 lealone.yaml 配置文件中使用环境变量
-
单个表可以拥有自己的专属 lob 存储
-
支持 shutdown server 语句
-
支持多个 net client,能大幅提升性能
-
jdbc client 支持阻塞 IO,能提升执行 jdbc 同步 api 的性能
-
表数据损坏时可以通过 repair table 语句修复