本文主要是介绍Floodlight源码阅读之内存数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
内存数据库的种类有很多,基于java数据结构就可以实现一个内存数据库,Floodlight里面的网络设备和拓扑结构就保存在写内存数据库中首先看
内存表MemoryTable
这个类主要的代码是
private String tableName;private Map<Object,Map<String,Object>> rowMap;private int nextId;MemoryTable(String tableName) {this.tableName = tableName;rowMap = new TreeMap<Object,Map<String,Object>>();nextId = 0;}
通过Map<Object,Map<String,Object>>这个TreeMap保存行信息,nextid相当于自增主键。
插入删除行也非常简单
void insertRow(Object key, Map<String,Object> rowValues) {assert(key != null);rowMap.put(key, rowValues);}void deleteRow(Object rowKey) {rowMap.remove(rowKey);}
ok看完了基本数据库model要看这个数据库怎么用了。
MemoryStorageSource这个类使用刚才定义的table,首先看insert方法
@Overrideprotected void insertRows(String tableName, List<Map<String,Object>> insertRowList) {MemoryTable table = getTable(tableName, false);String primaryKeyName = getTablePrimaryKeyName(tableName);synchronized (table) {for (Map<String,Object> row : insertRowList) {Object primaryKey = row.get(primaryKeyName);if (primaryKey == null) {if (primaryKeyName.equals(DEFAULT_PRIMARY_KEY_NAME)) {row = new HashMap<String,Object>(row);primaryKey = table.getNextId();row.put(primaryKeyName, primaryKey);}}table.insertRow(primaryKey, row);}}}
这个方法指定table的名称和行的list集合。通过for循环插入行,每行都是一个map,如果主键id是空的话就自增,如果不是空就直接插入即可。
有插入的方法自然就有对应删除方法
@Overrideprotected void deleteRowsImpl(String tableName, Set<Object> rowKeys) {MemoryTable table = getTable(tableName, false);synchronized (table) {for (Object rowKey : rowKeys) {table.deleteRow(rowKey);}}}
查询获取一行的方法
@Overrideprotected Map<String,Object> getRow(String tableName, String[] columnNameList, Object rowKey) {MemoryTable table = getTable(tableName, false);return table.getRow(rowKey);}
这样一个简单的内存数据就完成了
这篇关于Floodlight源码阅读之内存数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!