有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

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

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


共 (1) 个答案

  1. # 1 楼答案

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

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

    • ^H2 1.3中的{}。x嵌入式模式
    • ^H2 1.4中的{}。x嵌入式模式
    • ^tcp模式下的{}

    只要操作系统允许,您可以对数据库名称使用任何命名约定:user1、user2等。。。或者真正的登录名

    提示:

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

    注意事项:

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

    有关url参数的疑问,请参阅H2 manual