在处理海量数据的时候,我们发现有些数据不是关系型的。而是NO-SQL型数据。这就不使使用传统的数据库来处理了。我这里介绍一种非关系型数据库MongoDB数据库,它是由C++写的方案。特点是稳定,高效,而且处理海量数据时效果显著。
首先要去下载这个MongoDB.下载地地址为:http://www.mongodb.org/downloads
由于我是用JAVA去访问这个MongoDB的,所以要下载MongoDB驱动。下载地址为:
http://github.com/mongodb/mongo-java-driver/downloads
当然我们还要查看一些开发文档:
http://www.mongodb.org/display/DOCS/MongoDB
http://www.mongodb.org/display/DOCS/Tutorial
首先要配置好MongoDB以及工作目录。
默认情况下,在将这两个都放置在同一个盘符下面,比如我这里,我统一都放在D盘目录下面。
然后启动 MongoDB,在普通启动下(即单结点),有三种方式:
(1) 默认启动 bin/mongod
(2) 指定端口和数据目录 bin/mongod –dbpath=/var/data/ –port=556600
(3) 带有鉴权的启动 bin/mongod –auth
如果是分布式的情况下:
您需要启动的至少两个MongoDB文档数据库。
服务器1:192.168.1.10/Linux1
服务器2:192.168.1.11 /Linux2
启动服务器1:
bin/mongod –slave –source=192.168.1.11:556600 –dbpath=/var/db/ –port=556611 –slavedelay 10 &
启动服务器2:
bin/mongod –slave –source=192.168.1.10:556601 –dbpath=/var/db/ –port=556610 –slavedelay 10 &
PS:这里的意思是启动该服务器1,并且把服务器2作为主服务器,每10秒与主服务器2同步一次。启动服务器2的意思是,把服务器1作为主服务器,每10秒与服务器1同步一次。这样服务器1与服务器2就构成了同步了。
下面我主要讲解,单节点方式。
在bin目录下面,输入: mongod
然后再输入: mongo.exe
这样就可以去在shell中操作MongoDB了。
在实际项目开发过程中我们不可能通过Shell来操作MongoDB,这里我使用JAVA语言去操作。
下面是我例子的pakage层次:
我这里下载了mongo-java包以及其源码。
下面以MongoDbTest.java为例,讲解,代码如下所示:
package com.mongodb.test; import java.net.UnknownHostException; import java.util.List; import java.util.Set; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.MongoException; public class MongoDbTest { public static void main(String[] args) throws UnknownHostException,MongoException { // Mongo m = new Mongo(); // Mongo m = new Mongo("localhost"); // 获得数据库服务 Mongo m = new Mongo("localhost", 27017); // default port:27017 // 得到数据库mytest DB db = m.getDB("mytest"); // 得到mytest数据库下所有表名 Set<String> colls = db.getCollectionNames(); for (String s : colls) { System.out.println(s); } // 得到testCollection表 DBCollection coll = db.getCollection("testCollection"); // new 一个BasicDBObject对象doc BasicDBObject doc = new BasicDBObject(); // 赋值 doc.put("name", "MongoDB"); doc.put("type", "database"); doc.put("count", 1); //嵌套一个BasicDBObject对象至doc中 // 又new 一个BasicDBObject对象info BasicDBObject info = new BasicDBObject(); info.put("x", 203); info.put("y", 102); // 把info放入doc doc.put("info", info); // 向testCollection表中插入一条数据 coll.insert(doc); // 查询一条数据 DBObject myDoc = coll.findOne(); System.out.println(myDoc); // 循环插入100条数据到testCollection for (int i = 0; i < 100; i++) { coll.insert(new BasicDBObject().append("i", i)); } // Counting Documents in A Collection System.out.println(coll.getCount()); // Using a Cursor to Get All the Documents DBCursor cur = coll.find(); /** * 条件查询 * BasicDBObject query = new BasicDBObject(); query.put("name", "MongoDB"); //根据名字进行查询 DBCursor cur = coll.find(query); */ while(cur.hasNext()){ System.out.println(cur.next()); } } }
运行后,在控制台查询,如下所示:
由于一次不能显示100条,这里只18条记录。不过使用it,可以显示下面的数据。
下面这段代码是实现将一个zip文件存储在MongoDB端,然后还可以读取出来。
package com.mongodb.test; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import com.mongodb.DB; import com.mongodb.Mongo; import com.mongodb.gridfs.GridFS; import com.mongodb.gridfs.GridFSDBFile; import com.mongodb.gridfs.GridFSFile; public class MongoDBFileTest { static DB imgDB=null; static GridFS gridFS=null; public static void main(String[] args) throws Exception { long start=System.currentTimeMillis(); Mongo mongo = new Mongo("localhost", 27017); //数据库地址,端口号 imgDB = mongo.getDB("imgs"); // 数据库名称 gridFS = new GridFS(imgDB ); String fileName="android.zip"; // 读取428 M 的文件 String fileNameO="android1.zip"; // 写入文件名称 MongoDBFileTest mon= new MongoDBFileTest(); File fileIN = new File ("c:/"+fileName); File fileOUT = new File ("c:/"+fileNameO); /** * 将文件存入 MongoDB 数据库中 */ mon.saveFile(fileIN, fileName); long end=System.currentTimeMillis(); System.out.println (end -start); /** * 从MongoDB中读取数据,并且写入磁盘 */ List<?> list=mon.findFilesByName(fileName); GridFSDBFile gridFSDBFile=(GridFSDBFile) list.get(0) ; gridFSDBFile.writeTo(fileOUT); System.out.println (list.size() ); } /** * 写入文件 * @param fileName */ public void saveFile(File file,String fileName) { try { GridFSFile mongofile =gridFS.createFile(file); mongofile.put("filename", fileName); mongofile.put("uploadDate", new Date() ); mongofile.put("contentType",fileName.substring( fileName.lastIndexOf(".") )); mongofile.save(); } catch (IOException e) { e.printStackTrace(); } } /** * 读取文件 * @param fileName */ public List<GridFSDBFile> findFilesByName(String fileName) { List<GridFSDBFile> list =gridFS.find(fileName); return list; } }