private void load() {
		Set<Object> pinnedBlocks = new HashSet<Object>();
		
		try {
			Map<String, CollectionNameMeta> map = new HashMap<String, CollectionNameMeta>();
			Map<String, List<ColumnNameMeta>> collectionColumnMap = new HashMap<String, List<ColumnNameMeta>>();
			
			BlockPtr ptr = new SingleBlockPtr((byte) 0, 1*WonderDBPropertyManager.getInstance().getDefaultBlockSize());
			objectList = WonderDBList.load("_object", ptr, 1, new ColumnSerializerMetadata(SerializerManager.BLOCK_PTR_LIST_TYPE), pinnedBlocks);
			ResultIterator iter = objectList.iterator(new ColumnSerializerMetadata(SerializerManager.COLLECTION_NAME_META_TYPE), pinnedBlocks);
			try {
				while (iter.hasNext()) {
					ObjectListRecord record = (ObjectListRecord) iter.next();
					DBType column = record.getColumn();
					CollectionNameMeta cnm = (CollectionNameMeta) column;
					cnm.setRecordId(record.getRecordId());
					map.put(cnm.getName(), cnm);
				}
			} finally {
				iter.unlock(true);
			}
			
			ptr = new SingleBlockPtr((byte) 0, 2*WonderDBPropertyManager.getInstance().getDefaultBlockSize());
			objectColumnList = WonderDBList.load("_column", ptr, 1, new ColumnSerializerMetadata(SerializerManager.BLOCK_PTR_LIST_TYPE), pinnedBlocks);
			iter = objectColumnList.iterator(new ColumnSerializerMetadata(SerializerManager.COLUMN_NAME_META_TYPE), pinnedBlocks);
			try {
				while (iter.hasNext()) {
					ObjectListRecord record = (ObjectListRecord) iter.next();
					DBType column = record.getColumn();
					ColumnNameMeta cnm = (ColumnNameMeta) column;
					cnm.setRecId(record.getRecordId());
					List<ColumnNameMeta> list = collectionColumnMap.get(cnm.getCollectioName());
					if (list == null) {
						list = new ArrayList<ColumnNameMeta>();
						collectionColumnMap.put(cnm.getCollectioName(), list);
					}
					list.add(cnm);
				}
			} finally {
				iter.unlock(true);
			}
			
			Iterator<CollectionNameMeta> iter1 = map.values().iterator();
			while (iter1.hasNext()) {
				CollectionNameMeta meta = iter1.next();
				List<ColumnNameMeta> columns = collectionColumnMap.get(meta.getName());				
				try {
					String storageFile = StorageMetadata.getInstance().getFileName(meta.getHead().getFileId());
					CollectionMetadata colMeta = createCollection(meta.getName(), storageFile, columns);
					WonderDBList dbList = WonderDBList.load(meta.getName(), meta.getHead(), meta.getConcurrency(), 
							getTypeMetadata(meta.getName()), pinnedBlocks);
					colMeta.setDBList(dbList);
				} catch (InvalidCollectionNameException e) {
					e.printStackTrace();
				}
			}

			ptr = new SingleBlockPtr((byte) 0, 3*WonderDBPropertyManager.getInstance().getDefaultBlockSize());
			indexList = WonderDBList.load("_index", ptr, 1, new ColumnSerializerMetadata(SerializerManager.BLOCK_PTR_LIST_TYPE), pinnedBlocks);
			ResultIterator iter2 = indexList.iterator(new ColumnSerializerMetadata(SerializerManager.INDEX_NAME_META_TYPE), pinnedBlocks);
			try {
				while (iter2.hasNext()) {
					ObjectListRecord record = (ObjectListRecord) iter2.next(); 
					IndexNameMeta inm = (IndexNameMeta) record.getColumn(); 
					TypeMetadata meta = getIndexMetadata(inm);
					BTree tree = null;
					
					if (inm.getIndexType() == 1) {
						tree = HashIndexImpl.load(inm.getHead(), meta, pinnedBlocks);
					} else {
						tree = BTreeImpl.load(inm.isUnique(), inm.getHead(), meta, pinnedBlocks);
					}
					inm.setTree(tree);
					indexByName.put(inm.getIndexName(), inm);
					List<IndexNameMeta> list = collectionIndexes.get(inm.getCollectionName());
					if (list == null) {
						list = new ArrayList<IndexNameMeta>();
						collectionIndexes.put(inm.getCollectionName(), list);
					}
					list.add(inm);
				}
			} finally {
				iter2.unlock(true);
			}
		} finally {
			CacheEntryPinner.getInstance().unpin(pinnedBlocks, pinnedBlocks);
		}
	}