mongodb数据库笔记(慢慢更新)

本文围绕MongoDB展开,记录了使用中的多个要点。包括Date类型数据时区问题,其不保存时区信息但不影响查找;配置集群地址时需主备都配,主备切换有延时;还提及springboot中使用的基础设置,以及利用TTL索引定时删除数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔记1:mongodb中date类型数据时区问题
MongoDB中的Date类型数据只保存绝对时间值,不保存时区信息,所以java服务器的时间是东八区2018-11-22 8:00:00,那么存在mongodb中的时间是2018-11-22 0:00:00。从使用上来说是不会影响正常的时候,在作为查找条件时,java传入参数2018-11-22 8:00:00,可有查找到相应数据。
使用可视化工具查看数据时,可以在客户端选择时间显示方式。我用的是robo 3T,在Option->Display Dates In中可以选择标准时区还是本地时区。

笔记2、mongodb配置集群地址
mongodb没有和redis集群一样的虚拟ip,所以在主备切换的时候没有办法只配置一个ip地址,要把主备都配上

uri: mongodb://${userName}:${pwd}@${ip1:port},${ip2:port}/${authenticationDatabase}?authMechanism=SCRAM-SHA-1

然后主备之间的切换会有一定的延时。
加入现在主库不行了,有一条写请求会先出现异常

com.mongodb.MongoSocketOpenException: Exception opening socket
	at com.mongodb.connection.SocketStream.open(SocketStream.java:62)
	at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
	at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:128)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:59)
	at com.mongodb.connection.SocketStream.open(SocketStream.java:57)
	... 3 common frames omitted

然后连接到备库,这次写异常的数据会自动再提交一遍。
等到主库再启动起来,先主备同步数据,然后再切换回原来的主库

笔记3、springboot中使用mongodb的基础设置

@Configuration
public class MongodbConfig {

    public static final String MONGO_TEMPLATE = "mongoTemplate";

    public static final String MONGO_FACTORY = "mongoFactory";

    public static final String MONGO_CLIENT_SINGLE = "mongoClientSingle";

    @Resource
    private MongoProperties mongoProperties;

    @Bean(name = MONGO_TEMPLATE)
    public MongoTemplate getMongoTemplate() throws UnknownHostException {
        return new MongoTemplate(this.getMongoFactory());
    }

    @Bean(name = MONGO_FACTORY)
    public MongoDbFactory getMongoFactory() throws UnknownHostException {
        return new SimpleMongoDbFactory(this.getSingleMongoClient(), mongoProperties.getDatabase());
    }

    @Bean(name = MONGO_CLIENT_SINGLE)
    public MongoClient getSingleMongoClient() throws UnknownHostException {
        MongoClientOptions.Builder build = new MongoClientOptions.Builder();
        // 与目标数据库能够建立的最大connection数量为50
        build.connectionsPerHost(50);
        // 如果当前所有的connection都在使用中,则每个connection上可以有50个线程排队等待
        build.threadsAllowedToBlockForConnectionMultiplier(50);
		/*
		 * 一个线程访问数据库的时候,在成功获取到一个可用数据库连接之前的最长等待时间为2分钟
		 * 这里比较危险,如果超过maxWaitTime都没有获取到这个连接的话,该线程就会抛出SearchPlatformException
		 * 故这里设置的maxWaitTime应该足够大,以免由于排队线程过多造成的数据库访问失败
		 */
        build.maxWaitTime(1000 * 60 * 2);
        // 与数据库建立连接的timeout设置为1分钟
        build.connectTimeout(1000 * 60);
        //数据查询超时时间,默认30s
        build.serverSelectionTimeout(10000);
        return new MongoClient(new MongoClientURI(mongoProperties.getUri(), build));
    }
}

笔记4、定时删除mongodb中数据
利用TTL索引
方法1:XX秒后删除数据
方法2:定时删除数据
MongoDB 定时删除数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值