【问题标题】:How to structure my classes correctly如何正确构建我的课程
【发布时间】:2014-06-08 10:27:41
【问题描述】:

我在多线程应用程序中的类之间的交互中遇到了一些困难,我的主聊天服务器类首先创建一个 DBConnection 管理器类,然后为连接到我的服务器的每个客户端创建一个线程。当客户端连接时,我将连接传递给客户端线程,以便客户端可以与数据库交互,然后在完成后将连接返回到池。

出现的问题是,如果与数据库的连接断开,我的客户端线程无法重新建立数据库连接池,因为它可以重新初始化的唯一方法是与其“超级”对话,现在我不能使用 super 语句作为我的 clientThread 扩展 Thread 而不是我的主聊天服务器类。我该如何解决这个问题?

【问题讨论】:

    标签: java mysql multithreading connection-pooling


    【解决方案1】:

    委托通常是比继承更好的设计选择。 Foo has a Bar 通常比 Foo is a Bar 为您提供更多选择。

    我的 clientThread 扩展线程

    不要那样做。您的 clientThread 对象应该只是一个普通的 Thread,它由一些实现 Runnable 的 ClientFoobar 对象构成。

    class Client implements Runnable {
        private final DBConnectionManager dbConnectionManager;
        private ...other state...
    
        public Client(DBConnectionManager dbConnectionManager,...) {
            this.dbConnectionManager = dbConnectionManager;
            ...
        }
    
        @Override
        public void run() { ...interact with remote client... }
    }
    
    Thread clientThread = new Thread(new Client(dbConnectionManager,...)).start();
    

    【讨论】:

    • 嗨詹姆斯,也许我没有解释清楚,我的主类创建了数据库连接,我将它传递给每个线程,这样我就不会为每个线程创建一个连接,线程只是建立一个连接(拉来自连接池)当需要数据交换时。基本上我需要让我的客户端线程与主类对话,如果它被删除,则需要重新建立 dbconnection。
    • @XarionComoretto,让建立连接的代码成为客户端类的一部分,并让服务器线程传递客户端在构造时需要作为参数的所有对象会更简洁客户端。这就是我试图用我的例子来说明的。
    • 谢谢,对于我来说,按照您的解决方案建议为每个连接的客户端保持连接打开将是一个问题,但如果我不正确,我只需将 dbconnection 管理器移动到客户端线程。
    【解决方案2】:

    利用你的一些见解@james 想出了我如何做到这一点

    我变了:

        public class clientThread extends Thread {
        }
    

    收件人:

        public class clientThread extends MultiThreadChatServer implements Runnable {
        }
    

    这允许我使用我的超类在断开数据库连接时重新初始化我的连接池。

    在我的 Main 类 MultithreadChatServer 中,我创建了一个函数来重新初始化 db 连接(在应用程序启动时也会调用它)现在我的每个线程将在需要时使用池中的连接(只需游泳池当然足够大)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 2019-05-06
      • 2020-06-28
      • 1970-01-01
      • 2014-11-17
      • 2022-06-15
      相关资源
      最近更新 更多