1

我正在使用 Javalin 开发一个 Web 应用程序。我有多个控制器类为我处理路由。每个控制器都应该与一个 POJO/DB 表类型相关联。例如,我有一个 Employee 控制器来路由和显示与 Employee POJO 相关的页面。Employee 控制器(在后端)主要引用一个 Employee Dao 服务,然后查询数据库中的 Employee 表。到目前为止一切顺利,对吧?

我的问题是,我的一些前端页面必须包含来自其他表的详细信息,这意味着我正在我的 Employee 控制器中创建其他 DAO 服务的实例,例如,有时我需要 GroupDaoService 和 LocationDaoService 因为几个员工页面也显示组和位置信息。我想这会占用一点内存,因为每次加载不同的页面时,都会使用一组不同的 DaoService。所以我的问题是,这些 DaoServices 应该是单例吗?有一个 EmployeeDaoService 有意义吗?这些不同的 DaoServices 使用的底层数据库连接池类已经是一个 Singleton。我应该对我的 DaoServices 遵循同样的模式吗?

将我的 DaoServices 更改为 Singletons 是否有意义?

这是 EmployeeController 的一个示例部分,除了 EmployeeDao 之外,它还需要实现 3 或 4 种其他类型的 DAO,这就是引发这个问题的原因。

`    public static Handler serveUserDetails = ctx -> {
         List<Integer> recCounts = mainSVC.getTotalRecords();
         Map<String, Object> pdata = new HashMap();
         String userID = ctx.pathParam(":id");
         pdata.put("numEvents", recCounts.get(0));
         pdata.put("numSites", recCounts.get(1));
         pdata.put("numUsers", recCounts.get(2));
         pdata.put("user", userSVC.getEmployee(Integer.parseInt(userID)));
         pdata.put("groups", groupSVC.getGroups());
         pdata.put("schedules", schedSVC.getSchedules());
         pdata.put("webuser", W_EMP);
         ctx.render("/templates/userdetail.vtl", pdata);
    };`
4

1 回答 1

1

是的,这是有道理的。服务通常是单例的。我认为没有充分的理由在单个节点上的 Web 应用程序中需要多个实例。如果您使用 Spring 进行依赖注入,则单例已经是默认范围。

当然,这假设服务是无状态的,即不持有会话或请求相关数据。

于 2019-02-08T13:29:25.883 回答