Каковы законные причины для вызова MappedByteBuffer.force ()? - PullRequest
2 голосов
/ 01 апреля 2012

Я представляю два, но я хотел бы подтвердить, если я понимаю здесь:

1) JVM выходит из необработанного исключения =>, вероятно, здесь неправильно, поскольку выходящая JVM сделает это для меня, но не мешало бы быть в безопасности и сделать это самостоятельно в ShutdownHook.

2) Если мне нужно «накатить» ByteBuffer, то есть он превысит емкость, и мне нужен новый => Я думаю о вызове force () для того, который заполняется, затем отбросьте его, затем создайте новый, начинающийся в конце файла.

Идеальным решением было бы иметь ByteBuffer, который НИКОГДА не превышал бы емкость, но я хочу проверить этот сценарий и перебросить буфер байтов.

Так как вы думаете, я должен вызывать force () в описанных выше ситуациях? Могу ли я просто сбросить ByteBuffer и открыть новый, используя file.length (), не вызывая force () для предыдущего?

Вот мой код для моего flush метода:

        if (isMemoryMapped) {

            // first test if we are approaching the limit...
            int cap = buffer.capacity();
            int pos = buffer.position();
            float usage = (float) pos / cap;

            if (usage >= Log.getMappedBufferThreshold()) {
                // roll our buffer
                MappedByteBuffer mappedBuffer = (MappedByteBuffer) buffer;
                mappedBuffer.force();
                this.buffer = this.createMappedByteBuffer(outputFile, getMappedBufferSize());
            }

            // Then do NOTHING since this is a memory mapped buffer...

        }

1 Ответ

3 голосов
/ 01 апреля 2012

Каковы законные причины для вызова MappedByteBuffer.force ()?

В любое время, когда вам нужно, чтобы данные были записаны на диск СЕЙЧАС, а не в ожидании, пока буфер не будет отображенили приложение выходит.

Например, операция «принятие» в транзакционной базе данных, реализованной с использованием MappedByteBuffers, потребует от вас немедленной записи записанных данных на диск.

[[* ОБНОВЛЕНИЕ

После (повторного) чтения javadoc для MappedByteBuffer и FileChannel я пришел к выводу, что благоразумно также вызывать force() при закрытии приложения ... при условии, что вы хотитеобновления будут сброшены.Насколько я могу судить, спецификация не дает никаких гарантий, что данные будут сброшены отдельно в контексте вызова force().

END ]]

У меня сложилось впечатление, что файлы с отображением в памяти "магическим образом" отправляются на диск операционной системой, и вам НЕ нужно их сбрасывать.

Это не правильно.Если JVM умирает катастрофически (или имеет kill -9 'ed), тогда нет никакой гарантии, что сопоставленные буферы будут сброшены.Еще более неопределенно, если сама операционная система умрет.

Операция force() предназначена для случаев, когда вам нужна уверенность.В случае успеха вам гарантировано, что ваши изменения находятся на диске.

Ваши примеры могут быть законными или не зависеть от деталей заявки.Например, выполнение force() в ловушке отключения звучит немного опасно.Если приложение закрывается из-за того, что оно обнаружило внутреннюю ошибку, очистка буфера может на самом деле принести больше вреда ... в зависимости от того, насколько хорошо вы спроектировали структуры данных, отображаемые в память.

...