需求背景:某定时任务产生千条或更多JSON数据,本次数据还未完全写入数据库中,下一次定时任务的数据已经产生,由此而产生的数据拥堵怎么解决?
最初使用SpringBoot对MongoDB数据库做数据插入操作时,使用的是MongoTemplate中的save方法完成数据存储操作。
具体代码实现如下:
JSONArray为我从定时任务中获取到的数据。 for (int i = 0;i < jsonArray.size();i++){ mongoTemplate.save(jsonArray.get(i),"存储的库名"); }
此种方式存数据太慢,因为是遍历后一个一个存储,效率太低。
可以采用mongoCollection.insertMany()方法,此方法可以批量插入数据,效率很高
具体实现代码如下:
//首先,创建一个MongoDB连接数据库的工具类。 //此类使用的是无密码连接数据库的方法,如果你的数据库有密码,请参照文章末尾的代码。那个代码是使用用户名、密码连接数据库的方法,代码摘自菜鸟教程,亲测有效。 public class MongoDBJDBC { static String MONGO_IP = "数据库IP地址"; static Integer MONGO_PORT = 数据库端口号,默认为27017; public static MongoCollection getMongoDatabase(String databaseName,String collectionName){ MongoCollection mongoCollection = null; try { MongoClient mongoClient = new MongoClient(MONGO_IP,MONGO_PORT); MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName); mongoCollection = mongoDatabase.getCollection(collectionName); }catch (Exception e){ System.out.println(e.getClass().getName()+":"+e.getMessage()); } return mongoCollection; } } 获取到MongoCollection对象之后,使用其insertMany方法,插入一个集合。 public void insertData(){ //先使用remove方法,对某数据做删除,再做插入操作,以此实现批量数据的更新功能。 Query query = new Query(Criteria.where("busi_type"). is(TransformTime.getStringDate())); mongoTemplate.remove(query,"数据库中的集合名"); List<Document> list = //获取到需要插入到数据库中的方法。 //使用工具类,获取到指定数据库的MongoCollection对象 MongoCollection mongoCollection = MongoDBJDBC.getMongoDatabase("数据库名","数据库集合名"); mongoCollection.insertMany(list); }
MongoDB数据库有用户名、密码时,连接数据库的方法示例
import java.util.ArrayList; import java.util.List; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; public class MongoDBJDBC { public static void main(String[] args){ try { //连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址 //ServerAddress()两个参数分别为 服务器地址 和 端口 ServerAddress serverAddress = new ServerAddress("localhost",27017); List<ServerAddress> addrs = new ArrayList<ServerAddress>(); addrs.add(serverAddress); //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码 MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray()); List<MongoCredential> credentials = new ArrayList<MongoCredential>(); credentials.add(credential); //通过连接认证获取MongoDB连接 MongoClient mongoClient = new MongoClient(addrs,credentials); //连接到数据库 MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName"); System.out.println("Connect to database successfully"); } catch (Exception e) { System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }
本文系投稿作品,点击阅读原文即可阅读原作者的博客,欢迎大家投稿!