# PersistenceCollectionsLib **Repository Path**: swqxdba/PersistenceCollectionsLib ## Basic Information - **Project Name**: PersistenceCollectionsLib - **Description**: 持久化集合库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-01-13 - **Last Updated**: 2024-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 本项目提供了一个持久化集合库,或者可以认为是一个简单的存储引擎。 其目的是屏蔽持久层实现,无需在操作数据的时候考虑何时从数据库读取,何时存入。 简单来说,就是像操作内存中的集合类一样使用集合,无需考虑这些数据的持久化问题。 其一个很重要的功能就是自动加载应用程序的上下文的各种数据,当你的程序重启后,这些集合的数据会自动就绪,无需手动初始化。 ## 使用一个例子来直观地展示它的作用: ```java public class JavaDemo { public static void main(String[] args) { PersistenceContext persistenceContext = new PersistenceContext("."); List list = persistenceContext.openArrayList("list", new JdkSerializer<>(String.class), 100); list.add("666"); System.out.println(list); persistenceContext.close(); } } ``` 当第一次执行这段代码 会发现多出一个文件,位于./list-0 同时,程序的输出为 ``` {666} ``` 然后,我们重新运行以上代码,会发现输出变成了 ``` {666 ,666} ``` 你会看到,就像程序从未关闭一样,集合中可以读取到上次退出时存入的数据。 ## 再举一个例子,我们可以用它来保存session ```java static class SessionHolder{ static class Session implements Serializable { //user data } PersistenceContext persistenceContext = new PersistenceContext("./appData"); Map sessionMap = persistenceContext.openMap("session", new JdkSerializer<>(String.class), new JdkSerializer<>(Session.class), 1000); public Session getBySessionId(String sessionId){ return sessionMap.get(sessionId); } public void putSession(String sessionId, Session session){ sessionMap.put(sessionId,session); } //如果使用spring等IOC容器 可以设置一些生命周期回调 @BeforeDestroy public void close(){ persistenceContext.close(); } } ``` # 如何配置? 首先 推荐的入口是PersistenceContext 类 PersistenceContext用于管理一系列持久化集合,主要管理两件事;刷盘和关闭。 你需要创建一个PersistenceContext对象,在构造方法中指定根路径,然后可以看看里面有什么方法 : - 用来获取集合的方法是 openXXX(),用来获取持久化集合,获取的持久化集合会在PersistenceContext 中被注册。 你也可以直接new这些持久化集合 然后手动PersistenceContext.register()进行注册 - PersistenceContext本身可以看成一个工厂类,你可以对其进行一些配置,这些配置会在持久化集合创建的时候被传入: ~~~ var flushPerOption = false //是否每个操作都及时刷盘 var flushIntervalMills: Long = 1000 //当flushPerOption=false时 定时刷盘的间隔 var defaultFileMapperType: FileMapperType = FileMapperType.MergedMemoryMapMapper//默认使用的FileMapper var mapOrSetValueRedundancyBytesRatio: Float = -1f ~~~ ```java public class JavaDemo { public static void main(String[] args) { PersistenceContext persistenceContext = new PersistenceContext("."); persistenceContext.setDefaultFileMapperType(FileMapperType.MemoryMapMapper); persistenceContext.setFlushPerOption(false); persistenceContext.setFlushIntervalMills(1000); persistenceContext.setMapOrSetValueRedundancyBytesRatio(-1); List list = persistenceContext.openArrayList("list", new JdkSerializer<>(String.class), 100); list.add("666"); System.out.println(list); persistenceContext.close(); } } ```