В настоящее время я работаю над проектом, в котором я должен разместить сервер, который выбирает входной поток, анализирует данные и отправляет их в базу данных. Каждый клиент, который подключается к моему серверу, отправляет входной поток, который никогда не останавливается после его подключения. Каждому клиенту назначается сокет и его собственный объект потока парсера, поэтому сервер может иметь дело с потоком данных, поступающим от клиента. Объект parser обрабатывает только входящие данные и отправляет их в базу данных.Оптимизация многопоточного сервера java, использующего входной указатель
Server/анализатор генератор:
public void generateParsers() {
while (keepRunning) {
try {
Socket socket = s.accept();
// new connection
t = new Thread(new Parser(socket));
t.start();
} catch (IOException e) {
appLog.severe(e.getMessage());
}
}
}
Parser нить:
@Override
public void run() {
while (!socket.isClosed() && socket.isConnected()) {
try {
BufferedReader bufReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = bufReader.readLine();
String data = "";
if (line == null) {
socket.close();
} else if (Objects.equals(line, "<DATA")) {
while (!Objects.equals(line, "</DATA>")) {
data += line;
line = bufReader.readLine();
}
/*
Send the string that was build
from the client's datastream to the database
using the parse() function.
*/
parse(data);
}
}
} catch (IOException e) {
System.out.println("ERROR : " + e);
}
}
}
Моя установка функциональна, но проблема в том, что она доставляет слишком много стресса на моем сервере при подключении слишком много клиентов и таким образом, слишком много потоков одновременно анализируют данные. Разбор входящих данных и отправка данных в базу данных практически не влияют на производительность. Узким местом является, в основном, одновременное считывание потоков данных клиента от подключенных клиентов.
Есть ли способ, которым я могу оптимизировать текущую настройку? Я подумывал ограничить количество подключений и после получения полного файла данных, проанализировать его и перейти к следующему клиенту в очереди подключений или что-то подобное.
'data + = line;' вы можете реорганизовать эту конкатенацию строк, используя 'StringBuilder'. Также вы можете просмотреть свой код, чтобы узнать, есть ли какие-либо узкие места –