近期上了个活动,考虑后期的运维及人力成本,还是选择了阿里云的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大致的一个流程,有不懂的童鞋,可以留言。。。。我看到了就会回的。。。