阿里云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大致的一个流程,有不懂的童鞋,可以留言。。。。我看到了就会回的。。。

 

posted @ 2016-11-23 14:24  君哥~  阅读(614)  评论(0编辑  收藏  举报