• 阿里云MongoDB存储数据


    近期上了个活动,考虑后期的运维及人力成本,还是选择了阿里云的MongoDB,不过阿里云这玩意本地测试官方没有给本地测试链接地址,只能做映射上去了测了。。。

    选了个2核4G的,更多详细信息,可以去阿里上看:https://www.aliyun.com/product/mongodb

    1.环境要求:Spring4.0 以上  Pom依赖:(通过java的方式连接mongodb)

        <dependency>
    	<groupId>org.mongodb</groupId>
                 <artifactId>mongo-java-driver</artifactId>
    	     <version>3.0.4</version>
    	</dependency>
    		
    	<dependency>
    	    <groupId>org.springframework.data</groupId>
    	    <artifactId>spring-data-mongodb</artifactId>
    	    <version>1.7.1.RELEASE</version>
        </dependency>               
    

     整合Spring

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    	   	   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       		   http://www.springframework.org/schema/data/mongo
        		   http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
              
    	<!-- 这里需要指定一个Mongo URI来连接数据库,
    		   需要的信息可以从阿里云控制台上获取
    		   连接是帐号密码要跟帐号所在的数据库对应起来,否则无法通过认证
    		   默认创建的root帐号是admin数据库下的
    	
    	<bean class="com.mongodb.MongoURI" id="mongoURI">
    	    <constructor-arg value="mongodb://root:xxxx:port,xxxx:port/database?replicaSet=xxx"  />
    	</bean>
    	<bean class="com.mongodb.Mongo" id="mongo">
    	    <constructor-arg ref="mongoURI" />
    	</bean>
        <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    	    <constructor-arg name="mongo" ref="mongo"/>
    	    <constructor-arg name="databaseName" value="database"/>
    	</bean>-->
    	
       <!-- 本地测试用	
        <mongo:mongo-client host="映射到阿里云的ip" port="xxxx" credentials="root:MonGo2016Website@database" id="mongo">
         	<mongo:client-options write-concern="SAFE"/>
       	</mongo:mongo-client>-->
       	
    	<mongo:mongo-client id="mongoClient" host="xxxxx" port="xxxxx" credentials="root:MonGo2016Website@database">
            <mongo:client-options
    	        connections-per-host="8"
    	        threads-allowed-to-block-for-connection-multiplier="4"
    	        connect-timeout="3000"
    	        max-wait-time="10000"
    	        socket-keep-alive="true"
    	        socket-timeout="30000"
    	        write-concern="SAFE"/>
        </mongo:mongo-client>
    
      	<mongo:db-factory  id="mongoDbFactory" dbname="admin" mongo-ref="mongoClient" />
    
       	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
         	<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
       	</bean> 
       
    </beans>
    

     2.MongoDB增删改查操作类:

    AccountsInfo为用户类:普通的一些属性加上一个List集合gamesTotal,没什么别的东西,存储到mongodb中的数据,为两层嵌套的
    {
      "_id" : 1,
      "_class" : "com.odao.entity.AccountsInfo",
      "userId" : 1,
      "userName" : "xxxx",
      "date" : "2016-11-23 09:53:07" ,
      "gamesTotal" : [ ..... ]   
    
    }

    具体的org.springframework.data.mongodb.core.MongoTemplate api操作,网上一大把,这里就只举个例子了
    @Service
    public class MongoDBServiceImpl implements MongoDBService<AccountsInfo>{
    
    	@Resource
    	MongoTemplate mongoTemplate;
    	
    	/**
    	 * 保存信息
    	 */
    	@Override
    	public void saveAccountsInfo(AccountsInfo AccountsInfo) {
    		mongoTemplate.save(AccountsInfo);
    	}
    
    	/**
    	 * 根据用户Id查询用户信息
    	 */
    	@Override
    	public AccountsInfo getObjectByUserId(int userId) {
    		return mongoTemplate.findOne(new Query(Criteria.where("userId").is(userId)),AccountsInfo.class);
    	}
    	
    	/**
    	 * 集合下新增数据
    	 */
    	@Override
    	public WriteResult putGameToAccounts(int userId,GamesTotal games) {
    	    Query query = Query.query(Criteria.where("userId").is(userId));
                Update update = new Update();
                update.addToSet("gamesTotal", games);
                return mongoTemplate.upsert(query, update, AccountsInfo.class);
    	}
    	
    	/**
    	 * 更新
    	 */
    	@Override
    	public WriteResult updateGamesTotal(int userId,GamesTotal gamesTotal) {
    		Query query = new Query(Criteria.where("userId").is(userId).and("gamesTotal.gameId").is(gamesTotal.getGameId()));
            Update update = new Update();
            //首次进入时间
            update.set("gamesTotal.$.firstEnterTime", gamesTotal.getFirstEnterTime());
         
            。。。。。。。
    		
            return mongoTemplate.updateFirst(query, update, AccountsInfo.class);
    	}
    

     3.客户端工具用的是 NoSQL Manager for MongoDB Professional 破解版,用法很简单,稍稍研究下就可以了,注意点在配置连接的时候,要选择mongodb 3.x


    上述通过映射的方式,也不知道什么情况,连接数会慢慢的增加,并没有被释放

    db.serverStatus().connections
    { "current" : 73, "available" : 327, "internal_current" : 8, "internal_available" : 9992, "totalCreated" : NumberLong(290370)}

     连接满了,就GG了,后来没办法,把所有连接mongodb的项目全改成阿里云的方式去连接,情况才好转。

    如果有缘人看到这篇文章且恰好有解决方案,还望不吝赐教。。。

    注意:阿里云会切换IP跟端口,切换IP跟端口,切换IP跟端口,重要的事情说三遍,

    也就是说,线上最好是不要采用映射来连接mongodb,否则什么时候挂掉的都不知道,还是放阿里云的服务器上放心。

    以上就时使用阿里云mongodb大致的一个流程,有不懂的童鞋,可以留言。。。。我看到了就会回的。。。

  • 相关阅读:
    【老三层总结】老三层 页面 传值
    【总结-前台发送后台接收表单】MVC提交表单的四种方式
    Django使用Channels实现WebSocket数据推送功能
    关于子网、子网划分的一些内容
    关于摄像头推流拉流的一些内容
    群晖 docker frp公网访问
    Gitea搭建(搭建私有github仓库)
    frp内网穿透搭建流程,UDP通讯测试
    Centos7基础内容-命令
    Django 使用forms进行POST字段校验(文件上传校验)
  • 原文地址:https://www.cnblogs.com/wangfajun/p/6093497.html
Copyright © 2020-2023  润新知