笔记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 定时删除数据