Dao Services是Singletons吗?

时间:2019-02-08 13:25:01

标签: java model-view-controller singleton dao javalin

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

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

1 个答案:

答案 0 :(得分:1)

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

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