Java 一个JVM中有多个独立的H2数据库

Java 一个JVM中有多个独立的H2数据库,java,database,h2,multi-tenant,Java,Database,H2,Multi Tenant,是否可以在JVM中启动和关闭多个数据库 我的目标是通过为每个用户/帐户提供自己的数据库来提供支持。每个帐户都只有很少的数据。账户之间的数据从不一起访问、比较或分组;每个账户都是完全独立的。每个帐户每天只能短暂访问一次或每月访问几次。因此,将数据存储在一个数据库中没有什么好处,也有一些严重的缺点 所以我的想法是,当用户为某个特定帐户登录时,该帐户的数据库将被加载。当该用户注销或其web应用程序会话(app)超时时,该帐户的数据库将关闭,数据将刷新到存储,并且可能会执行备份。任何数量的数据库都会同时

是否可以在JVM中启动和关闭多个数据库

我的目标是通过为每个用户/帐户提供自己的数据库来提供支持。每个帐户都只有很少的数据。账户之间的数据从不一起访问、比较或分组;每个账户都是完全独立的。每个帐户每天只能短暂访问一次或每月访问几次。因此,将数据存储在一个数据库中没有什么好处,也有一些严重的缺点

所以我的想法是,当用户为某个特定帐户登录时,该帐户的数据库将被加载。当该用户注销或其web应用程序会话(app)超时时,该帐户的数据库将关闭,数据将刷新到存储,并且可能会执行备份。任何数量的数据库都会同时打开和关闭

好处包括:在任何时候将用于缓存数据和索引的内存量降至最低,将锁定和其他争用降至最低,并允许平滑扩展


我是H2新手,所以我不确定它的体系结构是否能够支持这一点。我要求您拒绝或确认此功能,以及任何提示或警告。

是的,可以这样做。每个数据库将包含自己的小环境,数据库之间不可能存在污染

例如,您可以基于用户id或用户登录名使用jdbc url:

  • jdbc:h2:user1
    在h2 1.3.x嵌入式模式下
  • jdbc:h2:./user1
    在h2 1.4.x嵌入式模式下
  • jdbc:h2:tcp://localhost/user1在tcp模式下
只要操作系统允许,您可以对数据库名称使用任何命名约定:user1、user2等。。。或者真正的登录名

提示:

  • 使用服务器模式而不是嵌入式模式,允许同一用户从多个会话/主机进行多个连接
  • 使用模式迁移器(如)初始化每个新创建的数据库
  • 确保在应用程序的顶层管理名称冲突,并可能将这些数据库和相应的登录名存储在专用数据库中
注意事项:

  • 不要使用连接池,因为连接很难重用
  • 必须确保服务器上未使用IFEXISTS=TRUE
  • 避免在JDBCURL上使用调整,如将LOG=0、UNDO_LOG=0等
  • 我不知道您的操作系统或JVM是否会限制可以像这样打开多少个db文件
  • 我不知道这样的设置是否可以从手册页面调整。我找不到

关于url参数的疑问,请参阅。

我正在考虑为一个项目使用相同的框架,考虑到您提出此问题已经两年了,您能否详细说明您选择做什么?您是否遇到任何连接限制?