繁体   English   中英

为连接到服务器应用程序的每个客户端打开新的数据库连接?

[英]Opening a new database connection for every client that connects to the server application?

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

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

就我们拥有的Java对象而言

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

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

因此这两个概念是

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

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

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

这些只是我的想法,所以请添加任何可能对决定有帮助的评论。

谢谢

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

那样,你可以

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

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

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

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

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

选项1的问题:

您已经说明了存在多个线程时的同步问题。 但除此之外还有许多其他问题,比如事务管理(你什么时候提交你的连接?),安全性(所有客户端都可以看到预先提交的值)..只是陈述一些..

选项2的问题:

其中两个最大的问题是:

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

连接池选项

这就是几乎所有客户端 - 服务器应用程序都使用连接池解决方案的原因。 池中有一组连接,可以正确获取和释放。 几乎所有Java框架都具有复杂的连接池解决方案。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM