MongoDb错误:当主机没有启用日记功能时,无法使用“j”选项

时间:2014-12-21 17:05:06

标签: java mongodb

我在开发中使用mongo就好了,在将应用程序部署到测试环境时,当对象保存在应用程序中时出现此错误

cannot use 'j' option when a host does not have journaling enabled


对于具有JOURNAL_SAFE的两个应用程序(dev vs test),Dispatcher servlet都是相同的
我做错了什么?

    <mongo:mongo host="127.0.0.1" port="27017" write-concern="JOURNAL_SAFE">
    <mongo:options connections-per-host="50"
               threads-allowed-to-block-for-connection-multiplier="4"
               connect-timeout="1000"
               max-wait-time="1500"
               auto-connect-retry="true"
               socket-keep-alive="true"
               socket-timeout="1500"
               slave-ok="true"
               write-number="1"
               write-timeout="0"
               write-fsync="false"/>
</mongo:mongo>

完整堆栈跟踪:

Caused by: com.mongodb.CommandFailureException: { "serverUsed" : "127.0.0.1:27017" , "ok" : 0 , "code" : 2 , "errmsg" : "cannot use 'j' option when a host does not have journaling enabled"} 
    at com.mongodb.CommandResult.getException(CommandResult.java:76) 
    at com.mongodb.CommandResult.throwOnError(CommandResult.java:131) 
    at com.mongodb.DBCollectionImpl$3.execute(DBCollectionImpl.java:498) 
    at com.mongodb.DBCollectionImpl$3.execute(DBCollectionImpl.java:491) 
    at com.mongodb.DBTCPConnector.doOperation(DBTCPConnector.java:210) 
    at com.mongodb.DBCollectionImpl.receiveWriteCommandMessage(DBCollectionImpl.java:491) 
    at com.mongodb.DBCollectionImpl.writeWithCommandProtocol(DBCollectionImpl.java:430) 
    at com.mongodb.DBCollectionImpl.updateWithCommandProtocol(DBCollectionImpl.java:417) 
    at com.mongodb.DBCollectionImpl.update(DBCollectionImpl.java:267) 
    at com.mongodb.DBCollection.update(DBCollection.java:191) 
    at com.mongodb.DBCollection.update(DBCollection.java:224) 
    at com.xerox.dao.MainDaoImpl.saveOrUpdatePrinter(MainDaoImpl.java:246) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) 
    ... 44 more

1 个答案:

答案 0 :(得分:5)

这是2.6的变化。 MongoDB服务器现在要求启用日记功能以使用具有日记功能的写入问题作为要求。在2.4中,在服务器静默忽略日志要求之前,服务器上未启用日记功能。

您测试MongoDB群集必须禁用日记功能。在服务器上启用日记功能或删除客户端上的默认写入问题(例如,删除/更改write-concern =“JOURNAL_SAFE”)。对于生产,您几乎肯定希望启用日记功能。

如果您正在使用具有至少3个数据保持成员的副本集(或副本集的共享集群),那么“多数”的写入问题可能是更好,更高效的选择。 (例如,写关注=“大多数”)。

如果您运行的是不属于副本集的单个Mongod进程,那么您可能需要关注日志,但需要确保未在服务器上禁用日记。如果您无法控制服务器(并且仍在使用单个mongod进程),那么您可能希望切换到FSYNC写入问题。对于FSYNC,如果服务器启用了日记功能,那么它将充当Journaled写入,对于没有启用日记功能的服务器,它将强制所有数据文件到磁盘(这将导致大量延迟)。说过你最好在服务器上启用日记功能。

罗布。