Java 在多线程套接字服务器中管理数据库连接

Java 在多线程套接字服务器中管理数据库连接,java,database,multithreading,Java,Database,Multithreading,我有一个简单的udp服务器,它接受数据包,解码数据包并将其插入数据库。由于可以有100000个并发连接,每个连接都有时间敏感的数据,因此需要尽快将数据插入数据库 为了实现这一点,我使用了一个带有50个线程的ExecutorService。当数据包进入时,池中的一个线程用于处理数据: //UdpServer public void run() { ExecutorService executor = Executors.newFixedThreadPool(50);

我有一个简单的udp服务器,它接受数据包,解码数据包并将其插入数据库。由于可以有100000个并发连接,每个连接都有时间敏感的数据,因此需要尽快将数据插入数据库

为了实现这一点,我使用了一个带有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();
        }
    }       
}
由于我有一个线程池,我想我不需要数据库池,因为在启动时,每个线程都可以打开一个数据库连接。这就是我为每个响应线程所做的:

//应答器类

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(...);
}
问题是当程序启动时,它似乎不会立即为每个线程建立数据库连接。当数据包被发送到服务器时,在插入数据之前有几秒钟的延迟,而这只是一个数据包。想象一下100000


我最好将数据库池(如BoneCP)与线程池结合使用,还是在这种情况下数据库池不会提高性能

线程池和数据库池有自己的用途。我认为一个不能代替另一个。使用数据库池,您可以依靠它们为线程提供现有的数据库连接。因此,IMPO我将使用数据库池和数据库推送线程池。

如果您让每个线程在启动时读取一个表,那么将建立连接。不过,我更喜欢使用第三方DB连接池。例如,ApacheDbcp如果您对数据库写入进行批处理,而不是对每个数据库写入进行更新,您将获得更好的吞吐量。我将有一组单独的线程读取排队事件,并将小批量(可能50个)写入数据库。这将使您能够像处理入站数据一样调整写入。如果批处理太大,则延迟会增加。我建议使用一个连接池来帮助管理连接。@ScaryWombat我正在使用Java8。ApacheDBCP似乎不支持它。我提到了BoneCP,因为之前在stackoverflow上提到过它。我想知道DBCP2是否是前向兼容的?如果不是的话,BoneCP应该做这件事,尽管我没有这方面的经验。是的,这听起来很合理。你可能想做100毫秒或者说1000条信息,哪一条先到。没有什么东西会等待太久,如果事情很忙,它会尝试尽快清空队列。如果您需要更高的性能,您也可以在Redis中查找后端。如果我使用第三方DB连接池,因为我在ExecuterService中使用50个线程,您是否建议将DB连接池设置为50个连接以容纳50个线程?@JohnMerlino,这取决于您的DB,如果您的数据库可以处理50个连接,而没有任何性能瓶颈,那么就去做吧。但是设置更多DB可以处理的连接没有任何意义。