我正在使用VMC创建一个站点,并使用bean将数据从模型传输到Controller / Views。
我计划实现一些基本的,非常简单的缓存,如果bean没有改变,将把bean存储在一个简单的结构中(随着使用量的增长,我们将在1.3版本周围实现更好的缓存系统)。
所以问题就在于我们的bean。
一种类型的bean只能保存基本数据,并依赖一些外部服务来完成其余工作(联系DAO获取查询,解析查询以加载bean值)。这是一个“贫血豆”模型,正如我的同事一再告诉我的那样: - )。
另一种类型的bean会更独立。它会知道DAO在哪里会直接调用DAO来获取数据查询。它将包含解析查询和设置属性所需的函数。它基本上将“服务”层的大部分与bean结合起来,将直接数据库留在DAO层中。
当然,对于控制器/视图,两个bean的外观和行为都相同。
但问题是内存以及ColdFusion / Java如何处理它。
使用贫血模型,bean只需要足够的内存来保存属性变量,只需触摸一下即可让它在需要时指向服务。
如果第二个类型bean中的函数较重,它会占用更多内存吗? bean的每个副本是否都有方法的完整副本?
我倾向于认为第二个模型没有更多的内存,因为它们会“共享”这些方法,并且只需要内存用于属性变量。
恕我直言,第二种方法会简化代码库,因为bean需要的代码更接近bean而不是分散在DAO和Services之间。它会减少服务中的简单函数,只需传递对bean的DAO的调用就可以在需要时直接转到DAO ......
这个问题有意义吗?或者至少我是怎么问的?
答案 0 :(得分:4)
所有内存管理都是在Java级别进行的,因此它遵循相同的规则。在Java中,创建对象实例时分配的唯一“新”内存是其成员变量;组件/类本身的方法没有内存占用:这些东西只存储在内存中一次,并带有引用。
一个可能的考虑因素是CFC的每个方法都被编译为自己的离散类(为什么?我不知道),所以每个方法都是它自己的类。与Java类使用相比,这可能意味着CFC使用的内存占用量略大,但这仍然不能与对象实例化一起扩展:对象的每个实例仍将仅消耗其成员变量的内存,而不是方法定义对象的CFC。
答案 1 :(得分:0)
默认情况下,所有cfm页面都被编译到内存中,CFC需要隐式存储在内存中(例如应用程序范围),以避免每次都实例化它,但是你需要为同一个组件需要相同的内存,任何其他用法取决于您在组件或bean中存储的任何数据。 你看过ColdSpring了吗?