#java #sockets #memcached #socketchannel
#java #сокеты #memcached #socketchannel
Вопрос:
Я внедряю промежуточное программное обеспечение между клиентами memaslap
эталонного теста и memcached
сервером. Размер ключа установлен равным 16 байтам, а размер значения — 1024 байта, поэтому запрос никогда не должен превышать 2048 байт, что MAX_PACKET_LENGTH
в следующем фрагменте кода:
ByteBuffer buffer = ByteBuffer.allocate(MAX_PACKET_LENGTH);
while(running) {
try {
buffer.clear();
socketChannel.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
....
}
Мне очень странно, почему после определенного количества запросов (это никогда не бывает одинаковым) возникает BufferOverflow, несмотря на то, что я делал buffer.clear()
раньше.
Кто-нибудь может мне помочь?
Комментарии:
1. Какая строка / метод генерирует исключение?
SocketChannel.read()
никогда не пытается прочитать больше данных, чем поместилось бы в буфер, поэтому он не будет выдаватьBufferOverflowException
. Один из способов, которым я предполагаю, что это может произойти, — это если вы изменяете буфер из другого потока во времяSocketChannel.read()
выполнения.2. @Jesper ты был прав. Существуют другие потоки, которые изменяют буфер. Отправка дубликата в другой поток решила проблему. спасибо