我正在构建客户端 - 服务器应用程序,我真的想建议如何设计服务器 - 数据库连接部分。 让我们说基本思路如下:
就我们的Java对象而言
因此,当客户端连接到服务器时,会在它们之间创建一个会话,通过该会话交换所有数据。现在困扰我的是我是否应该为每个客户端会话创建数据库对象/连接,或者我是否应该创建一个将处理所有请求的数据库对象。
因此这两个概念是
使用选项1 ,我猜所有方法都应该同步,以避免一个客户端线程不覆盖另一个客户端线程的变量。但是,在大量并发请求的情况下使其同步将是非常耗时的,因为每个请求都将被放入队列中,直到完成一个请求为止。
使用选项2 ,似乎是一个更合适的解决方案,但为每个客户端 - 服务器会话创建数据库对象是一项耗费内存的任务,另外为每个客户端创建数据库连接可能会导致问题当并发连接用户数量很大时再次。
这些只是我的想法,所以请添加对决定有帮助的任何评论。
谢谢
答案 0 :(得分:6)
选项3:使用连接池。每次要连接到数据库时,都会从池中获得连接。完成后,关闭连接以将其返回池中。
那样,你可以
基本上所有服务器应用都使用此策略。所有Java EE服务器都带有连接池。您也可以在Java SE应用程序中使用它,将池用作库(HikariCP,Tomcat连接池等)
答案 1 :(得分:0)
只需使用连接池并使用选项2.有很多 - C3P0,BoneCP,DBCP。我更喜欢BoneCP。
答案 2 :(得分:0)
我建议第三个选项,即数据库连接池。这样,您可以创建指定数量的连接,并在可用时立即提供第一个可用的免费连接。这为您提供了两全其美的选择 - 几乎总是可以快速获得免费连接,并且您可以将数据库的连接数保持在合理的水平。有很多盒子java连接池解决方案,所以看看在线。
答案 3 :(得分:0)
两者都不是好的解决方案。
选项1的问题:
当有多个线程时,您已经说明了同步问题。但除此之外还有许多其他问题,比如事务管理(你什么时候提交你的连接?),安全性(所有客户端都可以看到预先提交的值)..只是陈述一些......
选项2的问题:
其中两个最大的问题是:
连接池选项
这就是几乎所有客户端 - 服务器应用程序都使用连接池解决方案的原因。池中有一组连接,可以正确获取和释放。几乎所有Java框架都有复杂的连接池解决方案。
如果您没有使用任何JDBC框架(大多数使用Spring JDBC \ Hibernate),请阅读以下文章: http://docs.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html
如果您使用任何流行的Java框架(如Spring),我建议您使用框架提供的连接池。