队列方法还是单个数据库连接?

时间:2012-02-12 18:56:36

标签: java sockets optimization message-queue

我有套接字连接,它会通过databaseQueue.add(message);将数据发送到队列中。接下来是DatabaseProcessor类,它在启动期间作为线程启动,将建立单个数据库连接。连接将继续通过databaseQueue.take();和处理消息。关于这一部分的好处是,只需要建立一个数据库连接。当突然出现数据激增时就会出现问题。所以另一种方法是,对于收到的每个数据,我将打开和关闭方法。那么根据您的重负荷经验,这是最好的方式吗?

我的代码的一些片段。

class ConnectionHandler implements Runnable {
    ConnectionHandler(Socket receivedSocketConn1) {
      this.receivedSocketConn1=receivedSocketConn1;
    }


      // gets data from an inbound connection and queues it for databse update

      public void run() {
          databaseQueue.add(message); // put to db queue

       }
}
class DatabaseProcessor implements Runnable {
public void run()
      {
         // open database connection
         createConnection();
             while (true) 
             {
                  message = databaseQueue.take(); // keep taking message from the queue add by connectionhandler and here I will have a number of queries to run in terms of select,insert and updates.
                  }
        }

void createConnection()
 {
    System.out.println("Crerate Connection");
    connCreated = new Date();
    try 
     {
    dbconn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1?"+"user=user1&password=*******");
    dbconn.setAutoCommit(false);

     }
     catch(Throwable ex)
     {
       ex.printStackTrace(System.out);
     }

 }
}

public void main()
{
new Thread(new DatabaseProcessor()).start(); //calls the DatabaseProcessor
//initiate the socket 

}

3 个答案:

答案 0 :(得分:0)

据我所知,您正在管理客户端 - 服务器Socket连接,您可以通过队列发送和接收消息。如果我也做对了,你就是为队列中的每条新消息创建一个线程。

考虑到会发送和读取大量消息,我建议您在线程Synchronized中声明方法,这样每次数据都不需要打开和关闭流式传输。收到(请参阅此处的第二种方法)。同步方法通常是处理可由线程同时修改的公共数据激增的最佳方法。

答案 1 :(得分:0)

您可以使用连接池来充分利用这两个方面:您不仅限于单个线程,而且您也不需要为每个请求打开连接。看看Apache DBCP

答案 2 :(得分:0)

这种方法很好。除非您可以使用c3pO创建数据库池。还可以使用threadPool执行程序来模拟线程池。