【发布时间】:2014-11-20 19:18:34
【问题描述】:
我正在开发一款在线手机游戏。我有几台服务器机器运行大量 Java 套接字服务器应用程序实例。
玩家数据必须存储在某个地方(他们的个人资料、物品等)。为此,我想使用 H2 数据库。
现在,棘手的部分是:我希望将所有玩家数据存储在同一个 H2 数据库中。也就是说,出于方便,我所有的服务器应用程序都将通过 TCP 远程连接到一台特定的机器来访问数据。
问题是,我们预计在发布时会有大量客户。对于每个客户端,都会创建到 H2 数据库的连接。这里明显的问题是单个 H2 数据库进程是否可以同时处理这么多的连接。
来自the website:
每个人同时打开的数据库数量没有限制 服务器,或打开的连接数。
鉴于以上事实,理论上,如果我们的服务器机器有足够的资源(内存、空间、CPU 等),那么是的,H2 数据库应该能够处理我们资源允许的尽可能多的并发连接。
但我有一些不清楚的地方:
H2 进程是否为每个远程连接创建一个线程?我问这个是因为我曾经在 Windows(我们的 VPS 的操作系统)中读到,线程存储为短类型,因此应用程序可以生成的最大线程数大约是 32,000(我不知道他们使用的数学得到那个号码)。在这种情况下,H2 进程确实有并发连接的限制 - 这很麻烦,因为我确实预计连接的客户端超过 32,000 个。
当然,放弃为所有客户使用一个 H2 数据库的想法似乎是明智的。但是我想知道上面的说法是否正确:H2可以处理超过32,000个远程数据库连接吗?
【问题讨论】:
-
对所有客户端使用单一数据库很好。但是直接从客户端访问数据库并非如此。最好创建一些服务器应用程序,然后它将仅使用一些连接池连接到数据库,然后您的客户端将连接到服务器。
-
@Kamil.H,好吧,当客户端连接到我的服务器应用程序时,它会创建一个新线程:如果我有超过 32,000 个客户端连接到我的服务器应用程序,我会不会遇到同样的问题服务器应用程序?
-
我期待这样的答案。 :-) 很难说服务器是否可以处理这么多的连接。您应该对不同的服务器进行一些基准测试。现代 Java 服务器支持非阻塞 IO,这意味着它们不会为每个连接创建新线程。