由于最近在学习SE方面的知识,刚开始就遇到了一个很大的问题,数据存储问题?
随着Crawler抓取的网页越多,我们之前使用Java子带的ArrayList或者HashMap都不够存储,而且速度上也不能够很好满足我们的需要,所以这里推荐使用BerkeleyDB这种基于内存的小型数据库,它是嵌入式数据库,指的是嵌入在应用程序的数据库。
上Oracle官网可以下载到该库。
注意:加入lib的时候,只需要加入je那个jar就好了,反正我把其他也加进来的时候会报错:
java.lang.NullPointerException at com.sleepycat.je.dbi.MemoryBudget.
这种莫名奇妙,让我找来大半天,以致深夜。。。后来改成只加一个库就可以了。。。
推荐大家可以上网查查他的中文手册,有人翻译了,挺快就能够上手的。
首先他需要环境配置EnvironConfig
这个环境配置可以生成我们的环境Environment
然后利用这个环境产生我们的数据库Database
当然也许要数据库配置DatabaseConfig
搞清楚后就很简单了,其他就是一些配置设置问题。
为了以后项目使用,我简单的把该库封装成一个类似hashMap的使用方法
还没有看到游标那块,大家自己在丰富下这个函数就可以了,太晚了。。。困觉。。
import java.io.File; import java.io.Serializable; import java.io.UnsupportedEncodingException; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseConfig; import com.sleepycat.je.DatabaseEntry; import com.sleepycat.je.Environment; import com.sleepycat.je.EnvironmentConfig; import com.sleepycat.je.LockMode; import com.sleepycat.je.OperationStatus; public class Main { /** * @param args */ static Environment env = null; public static void main(String[] args) { BDBUtil<Integer, Student> bDB = new BDBUtil<Integer, Student>("testDB"); Student s1 = new Student(1,"ylf"); Student s2 = new Student(2,"dsb"); Student s3 = new Student(3,"dbc"); bDB.put(1, s1); bDB.put(2, s2); bDB.put(3, s3); Student s = new Student(); s.fromString(bDB.get(3)); System.out.println("my name is "+s.getName()+" no is "+s.getNo()); System.out.println(bDB.size()); bDB.close(); } } /** * 我们的BDB工具 * 目前对外提供添加数据和取得数据,删除数据3个接口 * 类似HashMap的使用方法 * 注意: * 这里的K 和 V两个类都必须实现来Serializable * 而且也实现来toString * 使用结束记得调用close() * @author ylf * */ class BDBUtil<K, V>{ private Environment env = null; private EnvironmentConfig envCfig = null; private Database db = null; private DatabaseConfig dbCfig = null; private File file = null; public BDBUtil(String dbName) { envCfig = new EnvironmentConfig(); envCfig.setAllowCreate(true); file = new File("./test/"); env = new Environment(file, envCfig); dbCfig = new DatabaseConfig(); dbCfig.setAllowCreate(true); db = env.openDatabase(null, dbName, dbCfig); } public boolean put(K keyStr, V valueStr){ DatabaseEntry key; try { key = new DatabaseEntry(keyStr.toString().getBytes("gb2312")); DatabaseEntry data = new DatabaseEntry(valueStr.toString().getBytes("gb2312")); db.put(null, key, data); return true; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return false; } } public String get(K keyStr){ DatabaseEntry key; String value = ""; try { key = new DatabaseEntry(keyStr.toString().getBytes("gb2312")); DatabaseEntry data = new DatabaseEntry(); if(db.get(null,key,data,LockMode.DEFAULT) == OperationStatus.SUCCESS) value = new String(data.getData(),"gb2312"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return value; } public boolean del(K keyStr){ DatabaseEntry key; try { key = new DatabaseEntry(keyStr.toString().getBytes("gb2312")); if(OperationStatus.SUCCESS == db.delete(null, key)) return true; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return false; } public long size(){ return db.count(); } public void close(){ db.close(); env.cleanLog(); env.close(); } } /** * 序列化了的类 * 实现toString() * @author ylf * */ class Student implements Serializable{ /** * */ private static final long serialVersionUID = 7333239714054069867L; private String name; private int no; public Student() { } public Student(int no, String name){ this.no = no; this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } @Override public String toString() { return "Student"+no+":"+name; } public void fromString(String str){ int i = str.indexOf(':'); String noStr = str.substring(7,i); this.no = Integer.parseInt(noStr); this.name = str.substring(i+1); } }