【发布时间】:2017-02-01 16:41:28
【问题描述】:
我目前正在做一个项目,我必须在其中托管一个服务器,该服务器获取输入流,解析数据并将其发送到数据库。每个连接到我的服务器的客户端都会发送一个输入流,一旦连接就永远不会停止。每个客户端都分配有一个套接字和它自己的解析器线程对象,因此服务器可以处理来自客户端的数据流。解析器对象只是处理传入的数据并将其发送到数据库。
服务器/解析器生成器:
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());
}
}
}
解析器线程:
@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重构这个字符串连接。您还可以分析您的代码以查找是否存在任何特定的瓶颈
标签: java multithreading sockets parsing