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

时间:2014-06-06 00:51:26

标签: java database multithreading

我有一个简单的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)与线程池结合使用,或者数据库池在这种情况下是否有助于提高性能?

1 个答案:

答案 0 :(得分:0)

线程池和数据库池有其自己的用途。我不认为可以取代另一个。使用数据库池,您可以依赖它们为线程提供现有的数据库连接。所以IMPO我会使用数据库池和你的数据库推送线程池。