作为单例的 Dao 服务?

Dao Services as Singletons?

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

我的问题是,我的一些前端页面必须包含来自其他 table 的详细信息,这意味着我正在我的 Employee 控制器中创建其他 DAO 服务的实例,例如,有时我需要 GroupDaoService 和LocationDaoService 因为几个员工页面也显示组和位置信息。我想这会占用一些内存,因为每次加载不同的页面时,都会使用一组不同的 DaoServices。所以我的问题是,这些 DaoServices 应该是 Singletons 吗?拥有一个 EmployeeDaoService 有意义吗?这些不同的 DaoServices 使用的底层数据库连接池 class 已经是单例。我的 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);
    };`

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

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