Spring-Data-Mongodb数据库连接代码示例
作为一名合格的程序员,除了要考虑需求的功能性实现之外,一定还要注意程序的健壮性,同时对于有运维经验的程序员来说,还要关注程序的安全性。年前闹得沸沸扬扬的Mongodb
赎金事件想必给很多程序员敲了个警钟!其实当时我也中招了,手头个人的和公司的项目都使用的Mongodb
,还好没有造成什么损失。对于服务器安全来说,稍微注意一点其实就可用避免百分之八九十的恶意估计,比如说:不使用默认端口、不使用简单密码、设置防火墙规则、数据库设置密码、使用nginx代理掩盖端口等等。总之,不应该抱着侥幸心理,不要偷懒!闲话不多说了,下面在Spring-Boot
下连接Mongodb
的简单示例代码,其功能包括:
1.使用用户名/密码;
2.设置主从备份数据库连接。
需要注意的是,不同的mongo-java-dirver
版本所支持的加密方式略有区别,我这里使用的是3.2.0
,低于3.0.0
版本的可能不支持Sha1
的加密方式。
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.core.MongoTemplate;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
@Configuration
public class MongoConfiguration extends AbstractMongoConfiguration {
@Value("${db.mongo.host}") private String mongoHost;
@Value("${db.mongo.host2}") private String mongoHost2;
@Value("${db.mongo.username}") private String mongoUsername;
@Value("${db.mongo.password}") private String mongoPassword;
@Value("${db.mongo.port}") private int mongoPort;
@Value("${db.mongo.database}") private String mongoDatabase;
@Value("${debug}") private boolean isDebug = false;
@Override
protected String getDatabaseName() {
return mongoDatabase;
}
@Override @Bean
public MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate(mongo(), getDatabaseName());
}
@Override @Bean
public Mongo mongo() throws Exception {
// 构建主备数据库Seed列表
List<ServerAddress> seedList = new ArrayList<ServerAddress>();
ServerAddress seed1 = new ServerAddress(mongoHost, mongoPort);
ServerAddress seed2 = new ServerAddress(mongoHost2, mongoPort);
seedList.add(seed1);
seedList.add(seed2);
// 构建鉴权信息,账号验证数据库名与数据库名一致
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(MongoCredential.createScramSha1Credential(mongoUsername,
getDatabaseName(), mongoPassword.toCharArray()));
// 构建操作选项,requiredReplicaSetName属性外的选项根据自己的实际需求配置,默认参数满足大多数场景
MongoClientOptions options = MongoClientOptions.builder()
.serverSelectionTimeout(3000)
.socketTimeout(2000)
.connectionsPerHost(10)
.build();
MongoClient client = null;
if(isDebug) {
client = new MongoClient(mongoHost, mongoPort);
} else {
client = new MongoClient(seedList, credentials, options);
}
return client;
}
}