【问题标题】:Opening a new database connection for every client that connects to the server application?为每个连接到服务器应用程序的客户端打开一个新的数据库连接?
【发布时间】:2015-01-25 18:14:13
【问题描述】:

我正在构建客户端-服务器应用程序,我真的很想获得有关如何设计服务器-数据库连接部分的建议。 假设基本思想如下:

  1. 客户端在服务器上进行身份验证。
  2. 客户端向服务器发送请求。
  3. 服务器将客户端的请求存储到本地数据库。

在我们拥有的 Java 对象方面

  • 客户端对象
  • 服务器对象
  • 数据库对象

因此,当客户端连接到服务器时,它们之间会创建一个会话,通过该会话交换所有数据。现在困扰我的是我是否应该为每个客户端会话创建一个数据库对象/连接,或者我是否应该创建一个处理所有请求的数据库对象。

因此这两个概念是

  1. 创建一个处理所有客户端请求的数据库对象
  2. 为每个客户端-服务器会话创建一个专用于客户端的数据库对象。

使用选项 1,我想所有方法都应该同步,以避免一个客户端线程不覆盖另一个客户端线程的变量。但是,在有大量并发请求的情况下,使其同步将非常耗时,因为每个请求都将被放入队列中,直到运行完成为止。

使用选项 2,似乎是更合适的解决方案,但为每个客户端-服务器会话创建数据库对象是一项消耗内存的任务,另外为每个客户端创建数据库连接可能会导致问题当并发连接的用户数很大时再次。

这些只是我的想法,所以请添加任何可能有助于决定的 cmet。

谢谢

【问题讨论】:

    标签: java database sockets object client-server


    【解决方案1】:

    选项 3:使用连接池。每次您想连接到数据库时,您都会从池中获得一个连接。完成后,关闭连接以将其返回给池。

    这样就可以了

    • 有多个客户端同时访问数据库(您的选项 1 不允许这样做)
    • 打开合理数量的连接,避免使数据库瘫痪或用尽可用连接(您的选项 2 不允许这样做)
    • 避免一直打开新的数据库连接(您的选项 2 不允许这样做)。打开连接是一项昂贵的操作。

    基本上所有服务器应用都使用这种策略。所有 Java EE 服务器都带有一个连接池。您还可以在 Java SE 应用程序中使用它,将池用作库(HikariCP、Tomcat 连接池等)

    【讨论】:

      【解决方案2】:

      我会建议第三个选项,数据库连接池。通过这种方式,您可以创建指定数量的连接,并在第一个可用的空闲连接可用时立即发出。这为您提供了两全其美的优势 - 几乎总是有快速可用的免费连接,并且您将数据库的连接数量保持在合理的水平。有很多盒子 java 连接池解决方案,所以在线查看。

      【讨论】:

        【解决方案3】:

        只需使用连接池并选择选项 2。有很多 - C3P0、BoneCP、DBCP。我更喜欢 BoneCP。

        【讨论】:

          【解决方案4】:

          两者都不是好的解决方案。

          选项 1 的问题:

          您已经说明了当有多个线程时同步的问题。但除此之外还有许多其他问题,例如事务管理(您打算何时提交连接?)、安全性(所有客户端都可以看到预先提交的值)……仅举几例……

          选项 2 的问题:

          最大的两个问题是:

          1. 每次创建新连接都需要花费大量时间。所以性能将成为一个问题。
          2. 数据库连接是极其昂贵的资源,应以有限的数量使用。如果您开始为每个客户端创建数据库连接,您将很快用完它们,尽管大多数连接不会被积极使用。您还会看到应用程序性能下降。

          连接池选项

          这就是为什么几乎所有客户端-服务器应用程序都使用连接池解决方案的原因。您在池中有一组连接,这些连接被适当地获取和释放。几乎所有 Java 框架都有复杂的连接池解决方案。

          如果您没有使用任何 JDBC 框架(大多数使用 Spring JDBC\Hibernate),请阅读以下文章: http://docs.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html

          如果您使用任何流行的 Java 框架,例如 Spring,我建议您使用框架提供的连接池。

          【讨论】:

            猜你喜欢
            • 2018-12-14
            • 2020-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多