У нас проблема с производительностью в нашем приложении, особенно когда клиент браузера отправляет на сервер большой объем данных POST.
Узким местом является чтение тела запроса сервлета в Stringbuffer, что у нас естьнаблюдаемые моменты времени более 10 секунд для больших запросов: ( 800 - 1400 КБ - что, с точки зрения браузеров, переводится во что-либо между 800 000 - 1 500 000 символов)
StringBuilder strBuilder = new StringBuilder(2 ^ 19);
InputStreamReader isr = new InputStreamReader(request.getInputStream());
BufferedReader bufReader = new BufferedReader(isr);
char[] charBuffer = new char[2 ^ 19];
for (int readCount = bufReader.read(charBuffer); readCount > -1; readCount = bufReader.read(charBuffer))
{
strBuilder.append(charBuffer, 0, readCount);
}
Несколько замечаний:
- Переменная 'reader' в приведенном выше примере кода соответствует javax.servlet.ServletRequest class
- Изначально буфер charразмер был в 128 , и StringBuilder без аргументов.
- Впоследствии я увеличил это значение до 2 ^ 19 , чтобы минимизировать количество итераций и изменение размера внутреннего буфера символов, используемого StringBuilder для больших запросов ввода (для примеров, подробно описанных выше)
Да, у меня есть ноющее чувство, что за этой проблемой могут скрываться проблемы с масштабируемостью :-).Однако, прежде чем переоценивать дизайн приложения, я хотел бы знать, есть ли какие-либо оптимизации вокруг этого блока кода, которые я мог бы попробовать.
Любые предложения будут высоко оценены.