Метод очереди или индивидуальное подключение БД? - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть сокетное соединение, которое отправит данные в очередь через 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 голосов
/ 12 февраля 2012

Вы можете использовать пул соединений, чтобы получить лучшее из обоих миров: вы не ограничены одним потоком, и вам также не нужно открывать соединения для каждого запроса. Посмотрите на Apache DBCP .

0 голосов
/ 12 февраля 2012

Этот подход хорош. За исключением того, что вы можете создать пул БД, используя c3pO. Также используйте средство исполнения threadPool для управления вашим пулом потоков.

0 голосов
/ 12 февраля 2012

Насколько я понимаю, вы управляете соединением клиент-сервер Socket, в котором вы отправляете и получаете сообщение через очередь. Если я тоже правильно понял, вы создаете поток для каждого нового сообщения в очереди.

Учитывая, что будет отправлено и прочитано много сообщений, я рекомендую вам объявить ваш метод (ы) в ваших темах Синхронизированный , чтобы вам не приходилось каждый раз открывать и закрывать потоковую передачу. данные получены (см. ваш второй подход здесь). Синхронизированные методы обычно являются лучшим способом справиться с потоком общих данных, которые могут быть изменены потоками одновременно.

...