5.2增加文档
我们使用insertOne方法来插入文档。
示例:添加文档记录--名称:铁扇公主 性别:女 年龄:28 地址:芭蕉洞 //获取连接 MongoClient client=new MongoClient(); //得到数据库 MongoDatabase database = client.getDatabase(\); //得到集合封装对象 MongoCollection
示例:将名称为铁扇公主的文档删除 //获取连接 MongoClient client=new MongoClient(); //得到数据库 MongoDatabase database = client.getDatabase(\); //得到集合封装对象 MongoCollection
示例:将红孩儿的地址修改为“南海” //获取连接 MongoClient client=new MongoClient(); //得到数据库 MongoDatabase database = client.getDatabase(\); //得到集合封装对象 MongoCollection
//修改的条件 BasicDBObject bson= new BasicDBObject(\, \红孩儿\); //修改后的值 BasicDBObject bson2 = new BasicDBObject(\,new BasicDBObject(\, \南海\)); //参数1:修改条件 参数2:修改后的值 collection.updateOne(bson, bson2); //collection.updateMany(filter, update);//修改符合条件的所有记录 updateMany方法用于修改符合条件的所有记录 updateOne方法用于修改符合条件的第一条记录
6.MongoDB连接池
6.1代码实现
MongoClient 被设计为线程安全的类,也就是我们在使用该类时不需要考虑并发的情况,这样我们可以考虑把MongoClient 做成一个静态变量,为所有线程公用,不必每次都销毁。这样可以极大提高执行效率。实际上,这是MongoDB提供的内置的连接池来实现的。 首先我们先创建一个“管理类”,相当于我们原来的BaseDao package cn.itcast.demo; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.MongoClientOptions.Builder; import com.mongodb.WriteConcern; import com.mongodb.client.MongoDatabase; public class MongoManager { } private static MongoClient mongoClient=null; //对mongoClient初始化 private static void init(){ } public static MongoDatabase getDatabase(){ } if(mongoClient==null){ } init(); mongoClient=new MongoClient(); return mongoClient.getDatabase(\);
然后我们创建一个StudentDao
package cn.itcast.demo; import org.bson.Document; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; /** * 学员数据访问层 * @author Administrator * */ public class StudentDao { } public void save(String name,String sex,double age,String address){ } MongoDatabase database = MongoManager.getDatabase(); MongoCollection
package cn.itcast.demo; import java.util.Date; public class TestPool { } public static void main(String[] args) { } long startTime = new Date().getTime();//开始时间 StudentDao studentDao=new StudentDao(); for(int i=0;i<20000;i++){ } long endTime = new Date().getTime();//完成时间 System.out.println(\完成时间:\+(endTime-startTime)+\毫秒\); studentDao.save(\测试\+i, \男\, 25.0, \测试地址\+i); 经过测试:所用毫秒数为3589
6.2参数设置
我们在刚才的代码基础上进行连接池参数的设置 修改MongoManager的init方法 //对mongoClient初始化 private static void init(){ } //连接池选项 Builder builder = new MongoClientOptions.Builder();//选项构建者 builder.connectTimeout(5000);//设置连接超时时间 builder.socketTimeout(5000);//读取数据的超时时间 builder.connectionsPerHost(30);//每个地址最大请求数 MongoClientOptions options = builder.build(); mongoClient=new MongoClient(\,options); builder.writeConcern(WriteConcern.NORMAL);//写入策略,仅抛出网络异常 再次进行测试:所用的毫秒1544
下面是写入策略。
WriteConcern.NONE:没有异常抛出
WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。 WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。 WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
7.综合案例-《网站点击日志分析组件》
7.1需求分析
《花生二手车》交易网站日访问IP高达2万+ ,每秒点击频率在2000次左右。为了能够对访问用户的行为做进一步的分析,产品部提出需求,用户每次点击浏览二手车都要记录该用户ID、访问IP、访问时间、点击车型、点击商品ID、价格等信息。
7.2数据库设计
浏览日志browseLog 字段名称 userid ip browseTime model goodsid price remark 字段类型 字符 字符 时间 字符 字符 数值 字符 字段含义 用户ID 访问IP 访问时间 点击车型 点击商品ID 价格 备注 7.3日志写入
(1)创建工程sitelog ,在pom.xml中引入依赖。
(2)在src/main/resources 添加配置文件sitelog.properties host=127.0.0.1 port=27017 这个配置文件用于配置主机地址和端口
(3)创建包com.huasheng.sitelog,建立Config 类,用于读取配置文件