我有一个简单的udp服务器接受数据包,解码数据包并将它们插入数据库。由于可以有100,000个并发连接,每个连接都有时间敏感数据,因此需要尽快将数据插入数据库。
为了实现这一点,我使用了一个包含50个线程的ExecutorService。当数据包进入时,池中的一个线程用于处理数据:
// UdpServer
public void run() {
ExecutorService executor = Executors.newFixedThreadPool(50);
while (listening) {
try {
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
executor.execute(new Responder(socket, packet));
} catch (IOException e) {
e.printStackTrace();
}
}
}
由于我有一个线程池,我认为我不需要数据库池,因为在启动时每个线程都可以打开一个数据库连接。这就是我为每个Responder线程做的事情:
//响应者类
public void run() {
this.connection = DriverManager.getConnection(url, username, password);
processPacket();
connection.close();
}
private void processPacket(){
Report report = ReportParser.readReport(packet);
report.setConnection(connection);
report.save();
}
//报告类
public void save(){
stmt = connection.createStatement();
rs = stmt.executeQuery(...);
}
问题是程序启动时似乎没有立即为每个线程建立数据库连接。当数据包发送到服务器时,插入数据之前有几秒钟的延迟,这只是一个数据包。想象一下100,000。
我最好将数据库池(如BoneCP)与线程池结合使用,或者数据库池在这种情况下是否有助于提高性能?
答案 0 :(得分:0)
线程池和数据库池有其自己的用途。我不认为可以取代另一个。使用数据库池,您可以依赖它们为线程提供现有的数据库连接。所以IMPO我会使用数据库池和你的数据库推送线程池。