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

时间:2014-11-20 19:18:35

标签: java database h2

我正在开发一款在线手机游戏。我有几台服务器机器运行Java套接字服务器应用程序的大量实例。

播放器数据必须存储在某个地方(他们的个人资料,项目等)。我想为此目的使用H2数据库。

现在,这是一个棘手的部分:我希望所有玩家数据都存储在同一个H2数据库中。也就是说,所有我的服务器应用程序都将通过TCP远程连接到一台特定的机器来访问数据,这是不方便的。

问题是,我们期待在推出时有大量客户。对于每个客户端,都会创建与H2数据库的连接。这里显而易见的问题是,单个H2数据库进程是否可以同时处理这么多连接。

来自the website

  

每个数据库并发打开的数量没有限制   服务器,或打开的连接数。

鉴于上述事实,理论上,如果我们的服务器机器有足够的资源(内存,空间,CPU等),那么是的,H2数据库应该能够处理我们的资源允许的并发连接数。

但有些事情我不清楚:

H2进程是否为每个远程连接创建一个线程?我问这个是因为我曾经在Windows(我们的VPS'操作系统)中读到过,一个线程存储为一个短类型,因此应用程序可以产生的最大线程数大约是32,000(我不知道)他们用来得到那个数字的数学)。在这种情况下,然后H2进程确实有并发连接的限制 - 这是令人不安的,因为我确实期望连接超过32,000个客户端。

当然,放弃为我的所有客户提供一个H2数据库的想法似乎是明智之举。但是我想知道上述陈述是否正确: H2可以处理超过32,000个远程数据库连接吗?

1 个答案:

答案 0 :(得分:1)

让我们按部分来看:

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

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

" H2可以处理超过32,000个远程数据库连接吗? "

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

" 当然,放弃为我的所有客户提供一个H2数据库的想法似乎是明智的 "

可能是,但您必须记住,打开数据库的数量受可用内存的限制。如果您在强大的服务器上运行,则可能是一个很好的选择。然后,它可能不会。