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 是不是为每个远程连接生成一个新线程?那么,有限制吗?的主要内容,如果未能解决你的问题,请参考以下文章