H2 是不是为每个远程连接生成一个新线程?那么,有限制吗?

Posted

技术标签:

【中文标题】H2 是不是为每个远程连接生成一个新线程?那么,有限制吗?【英文标题】:Does H2 spawn a new thread for each remote connection? Then, is there a limit?H2 是否为每个远程连接生成一个新线程?那么,有限制吗? 【发布时间】: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,这意味着它们不会为每个连接创建新线程。 【参考方案1】:

让我们分部分进行:

"H2 进程是否为每个远程连接创建一个线程?"

应用程序通常应该每个线程使用一个连接。一个 H2 数据库同步访问同一个连接,但其他数据库可能不会这样做。

H2 能否处理超过 32,000 个远程数据库连接?

如果要从不同的进程或计算机同时访问同一个数据库,则需要使用客户端/服务器模式。 JdbcConnectionPool 类的默认最大连接数设置为 10,但它提供了一个设置器来根据需要更改它。理论上,你可以设置为Integer.MAX_VALUE,但我认为这并不明智。为什么?对于初学者,上一节中提出的同步点。要考虑的另一点是,如果您的应用程序打开和关闭连接很多(例如,对于每个请求),您应该考虑使用连接池。打开数据库连接非常慢。

当然,放弃为所有客户使用一个 H2 数据库的想法似乎是明智之举

可能是这样,但您必须记住,打开数据库的数量受可用内存的限制。如果您在功能强大的服务器上运行,那么它可能是一个不错的选择。再说一次,它可能不会。

【讨论】:

H2同步访问同一个连接是什么意思? 我明白了。但是,如果我的客户确实同时更改了数据库中的信息怎么办?顺便说一句,我一直在玩,从我的笔记本电脑到服务器建立了几个连接,显然每个连接确实在服务器中产生了一个新线程。 对不起,我删除了我之前的评论,而我的意思是编辑。就是这样:H2 是多线程安全的。这意味着,如果应用程序是多线程的,则无需担心同步访问数据库。在内部,对同一数据库的大多数请求都是同步的。这意味着一个应用程序可以使用多个线程同时访问同一个数据库,但是如果一个线程执行一个长时间运行的查询,或者正在更新信息,其他线程将被阻塞。线程调度负责其余的工作。 我希望这些信息对您有用。我不是后端人员或测试工程师。我只是一个开发者。据我所知,这差不多。 谢谢 - 您认为每个线程都有一个 Connection 对象会有所不同,还是所有线程都可以使用相同的 Connection 对象?

以上是关于H2 是不是为每个远程连接生成一个新线程?那么,有限制吗?的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode——H2O生成(多线程)

在新窗口 C++ 中创建线程

为每个线程生成一个新的对象实例是线程安全的操作吗?

Tomcat是不是为每个用户创建一个线程?

每个线程的新连接实例上的连接池 (JDBC)

LeetCode 多线程 1117. H2O 生成