-
Notifications
You must be signed in to change notification settings - Fork 118
Closed
Description
为什么要做
技术改进:database-ptc-object 模块在遇到容器类型的参数时,需要明确的关联机制来正确处理这些类型。
怎么做
扩展现有 API,在 database-ptc-object 模块中增加对容器类型参数的关联支持。
实现方案
1. 容器类型子表存储
数据类中的 List<String>、Set<String>、Map<String, String> 字段不存储为主表列,而是自动创建独立子表:
- List 子表:
parent_{id},value,sort_order— 通过sort_order保持插入顺序 - Set 子表:
parent_{id},value— 无序存储 - Map 子表:
parent_{id},map_key,map_value— 键值对存储
支持 SQLite / MySQL / PostgreSQL 三种数据库,insert/update/delete 时自动同步子表数据。
2. 连接池死锁修复
将读取路径拆分为两阶段:
- Phase 1(持有连接):读主表 ResultSet 到 Map
- Phase 2(连接已释放):加载容器子表数据
解决 maximumPoolSize=1 场景下嵌套获取连接导致的超时死锁。
3. Collection Accessor API
新增 DatabaseMap / DatabaseList / DatabaseSet 代理类,实现标准 Kotlin MutableMap / MutableList / MutableSet 接口。用户通过 mapOf() / listOf() / setOf() 获取代理后,像操作普通集合一样使用,所有操作自动转化为 SQL:
val props = mapper.mapOf("player1", "properties")
props["lang"] = "zh_CN" // → DELETE + INSERT
props["lang"] // → SELECT
props.remove("lang") // → DELETE
val tags = mapper.listOf("player1", "tags")
tags.add("newTag") // → INSERT (append)
tags[0] // → SELECT LIMIT 1 OFFSET 0
tags.removeAt(1) // → DELETE + UPDATE sort_order修改文件
| 文件 | 改动 |
|---|---|
AnalyzedClass.kt |
新增 hasCollectionMembers / collectionMembers |
AnalyzedClassMember.kt |
新增 isList / isSet / isMap / isCollection |
Container.kt |
容器接口支持 collectionTableInfos |
ContainerOperatorImpl.kt |
两阶段读取 + Accessor 工厂方法 + PG 引用修复 |
ContainerSQL.kt / ContainerSQLite.kt / ContainerPostgreSQL.kt |
子表建表逻辑 |
CollectionTableInfo.kt |
新建 — 子表元数据 |
CollectionAccessor.kt |
新建 — DatabaseMap / DatabaseList / DatabaseSet 代理类 |
DataMapper.kt |
接口新增 mapOf / listOf / setOf(各两个重载) |
DataMapperImpl.kt / TransactionalDataMapper.kt |
实现 Accessor 委托 |
CollectionTest.kt |
新建 — 14 个容器测试用例 |
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels