Mongodb是我非常喜爱的数据库,最近我将数据库升级到4.0,jdbc driver升级到3.9.1。
不过遇到问题是:mongo jdbc driver启动特别慢。一般耗时30~40秒。
mongoClient=MongoClients.create( settings );
起先怀疑是java.security.SecureRandom捣鬼,后来发现并不是这样。经过不断摘取mongo jdbc driver的ObjectId代码,跟踪到是这个方法运行特别慢。
private static short createProcessIdentifier() {
short processId;
try {
RuntimeMXBean runtimeMXBean=java.lang.management.ManagementFactory.getRuntimeMXBean();
System.out.println( "Mxbean:"+new Date() ); // 添加的打印
String processName = runtimeMXBean.getName();
System.out.println( "Mxbean getname:"+new Date() ); // 添加的打印
if (processName.contains("@")) {
processId = (short) Integer.parseInt(processName.substring(0, processName.indexOf('@')));
} else {
processId = (short) runtimeMXBean.getName().hashCode();
}
} catch (Throwable t) {
// JMX not available on Android, use SecureRandom instead
processId = (short) new SecureRandom().nextInt();
//LOGGER.debug("Failed to get process identifier from JMX, using SecureRandom instead");
}
return processId;
}
String processName = runtimeMXBean.getName(); 耗时30秒左右。
搞了半天,也找不到为什么慢的资料。只好随手hack一下:
- 在我的java工程test里面,创建这个类:org.bson.types.ObjectId
- 把官方的ObjectId代码复制进来,注释掉 try / catch,直接使用processId = (short) new SecureRandom().nextInt();
- Done
这样,无论我的tomcat还是junit测试,都优先加载我“覆盖”编写的ObjectId,而不是mongo-jdbc-driver-xxx.jar里面的ObjectId。从30~40秒等待降到1秒,大幅提高开发效率!!