Spring-Data-Mongodb資料庫連線程式碼示例

肖老闆發表於2017-03-13

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;
    }
}

相關文章