哪个是合适的架构?

时间:2012-03-01 18:15:37

标签: java database sockets

我已经测试了一个套接字连接程序,其中套接字连接将是一个独立的线程,然后它将入队,而另一个用于dbprocessor的独立线程将从队列中选择并运行许多sql语句。所以我注意到这里是db处理的瓶颈。我想知道我正在做的是正确的架构,还是我应该改变或改进我的设计流程?

要求是通过套接字连接捕获数据并运行db进程,然后相应地存储它。

public class cServer
{
 private LinkedBlockingQueue<String> databaseQueue = new LinkedBlockingQueue<String>();

   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
    try 
    {
      final ServerSocket serverSocketConn = new ServerSocket(8000);             
      while (true){
        try{
            Socket socketConn1 = serverSocketConn.accept();
            new Thread(new ConnectionHandler(socketConn1)).start();                     
       }
       catch(Exception e){
         e.printStackTrace(System.out);
       }
      }
    } 
    catch (Exception e){
      e.printStackTrace(System.out);
    }

    }

}

3 个答案:

答案 0 :(得分:1)

通常,您的架构听起来是正确的。在从队列读取/写入时,您需要确保正确同步两个线程。

我不确定你所说的“数据库处理的瓶颈”是什么意思?如果数据库处理花费很长时间并且你最终得到一个长队列,除了让多个线程执行数据库处理(假设处理可以并行处理,当然)或者在数据库中进行一些性能调整之外,你可以做的事情并不多。数据库线程。

如果您发布了一些您认为导致问题的特定代码,我们可以再看看。

答案 1 :(得分:1)

在没有要求的情况下判断架构很难(阅读&#39;不可能&#39;)。所以我会做一些:

最大吞吐量: 不要使用数据库,写入平面文件,可能存储在像固态光盘一样快的东西上。

保证持久性(如果用户得到的答案不包含错误,则必须安全地存储数据): 使整个事物单线程化,使用冗余光盘保存数据库中的所有内容。确保您拥有一位熟悉备份和恢复的DBA。定期测试。

完成用户请求的最短时间: 你的方法似乎合理。

完成用户请求的最短时间+最大化吞吐量+良好持久性(这意味着什么): 你的方法似乎很好。您可能计划处理数据库请求的多个线程。但是要测试你实际得到多少(更多)吞吐量以及瓶颈究竟在哪里(网络,数据库CPU,IO,锁争用......)。确保您不会通过使用并发方法来引入错误。

答案 2 :(得分:1)

这个简单的任务不需要两个线程。只需读取套接字并执行语句。