在webapp中使用Java和JSON文件设计建议

时间:2016-05-17 12:50:10

标签: java json jsp concurrency io

我需要您对设计的反馈和建议。

我有(无法更改):

  1. Web应用程序(JSP / Servlets)
  2. 服务器(数据库)上的JSON文件
  3. 使用案例

    1. 同时阅读JSON的信息
    2. 同步写信息
    3. 让我解释一下这个问题:

      JSON文件基本上包含以下信息:

      {
        "modules": {
          "module1": {
            "sub-module1": {
              "info": "some faq statememt"
            },
            "sub-module2": {
              "info": "some faq statememt"
            }
          },
          "module2": {
            "sub-module1": {
              "info": "info on module2: submodule1"
            }
          }
        }
      }
      

      现在所有用户都可以通过JSP请求任何模块,然后是子模块来读取信息。 该程序基本上获取所请求的信息,加载JSON文件,将其映射到模型对象,并通过AJAX将相关信息返回给JSP。

      管理员用户可以通过添加新密钥/信息来编辑现有信息 或者通过编辑现有信息。

      约束:多个管理员不会进行相同的密钥编辑。

      我已经编写了应用程序,但现在并发了。 此时,通过FileInputStream和FileOutputStream访问该文件。

      我有以下问题,我需要他们的答案,因为我对IO知之甚少:

      1. 如果写入花费很长时间会发生什么,那么读取会抛出异常吗?如何处理?
      2. 如何确保并发读取和同步写入成功?可能write方法可以在Data Access类的单个对象上同步,但是我们如何处理读取请求呢?
      3. 由于获取现有信息或写回,整个JSON对象(使用Boon)映射到我的程序中的主模型,我担心这可能有一天会导致严重的死锁或内存问题。如何逃避这个?

2 个答案:

答案 0 :(得分:1)

根据您在评论中的回答判断,您可以将每个键的监视器对象保存在内存中,然后同步键上的写入代码。 监视器。这将避免并发访问,同时保持一定程度的性能。但是,这应该通过使用nosql数据库或其他工具而不是直接读/写文件来避免。

编辑:事实证明你只有大约80个键。您可以将少量数据保留在内存中,并使用java同步处理并发访问。只需添加一个后台作业,然后立即将数据写入磁盘。

答案 1 :(得分:0)

对于问题-2;

在Java中,servlet本质上是单例对象,如果你担心线程安全,你绝对应该使用包装类并为每个请求创建实例以防止 Race Condition

  

对于未在分布式环境中托管的servlet(默认),   servlet容器每个servlet只能使用一个实例   宣言。但是,对于实现SingleThreadModel的servlet   接口,servlet容器可以实例化多个实例   处理繁重的请求加载并将请求序列化到特定的   实例