我正在编写一个运行用户提交的Java代码的Java应用程序。我在自己的沙箱中运行每个用户提交的代码。这个沙箱涉及(除其他事项外)在一个单独的进程中运行每个代码提交,在一个单独的JVM中(据我所知,没有其他方法可靠地控制提交代码的内存和CPU使用,缺少字节码级别检查/分析)。
我希望每个沙盒进程都可以访问某个数据库。数据库很大(大约10 GB,将来可能会大得多),用户提交的代码可能会对数据库进行数十亿或更少的随机访问。因此,用户提交的代码能够有效地访问数据库非常重要。
我认为应该这样做:从主监督进程将数据库加载到内存中,然后为每个沙盒进程提供对加载数据库的只读访问权限。我怎样才能做到这一点? (同样,我在Java工作。)
或者我有错误的想法?我应该尝试不同的方法吗?
答案 0 :(得分:1)
我不认为考虑到您所谈论的数据量(10GB或更多),将其保存在内存中是可行的。
我建议使用SQLite数据库解决方案。
从每个衍生进程中,您可以在read-only mode中打开数据库,并通过标准JDBC调用访问它,或将其包装在您自己设计的某个API中。
这样做的另一个好处是,如果性能成为问题,您可以转向成熟的数据库解决方案。
如果您没有在第一个数据中控制数据的格式,您可以轻松编写从新数据文件更新SQLite数据库的导入程序。
答案 1 :(得分:0)
根本不要让他们直接访问数据库。而是为Java程序提供API,而该API没有改变数据库内容的方法。