我正在努力寻找“静态/全球”的常用设计/方法! Web应用程序中的数据访问/存储,我正在使用struts 2.背景,我想在我的Web应用程序中显示许多表。
问题1。 这些表只会在服务器上每天更改一次并更新一次,我不想访问数据库/或为查看表的每个请求加载文件。 我宁愿将表加载到某个全局内存/缓存一次(一天),每个请求从那里获取表,而不是访问数据库。 我想这是一种常见的情况,并且有一种既定的方法?但我现在无法找到它。 对于struts 2,ActionContext是否适合此数据。 如果是这样,任何指向教程的链接都会非常感激。
问题2。 这些表存储在我用JAXB解组的XML文件中以获取表对象,以及表的列表。 对于一个小应用程序,这没关系,但我认为对于Web应用程序来说,将xml作为资源存储并将其作为servlet上下文和解析读入文件是hacky,还是它? 我意识到可能会告诉我将表存储到使用dao访问的数据库中,并使用hibernate来获取对象。 我很好奇数据已经存储在XML文件中的常用方法是什么?鉴于我每天都会有新的XML文件。
道歉,如果问题是基本的,我有大量的书籍/参考资料,但它只是花时间来获得更高层次的设计答案。
答案 0 :(得分:2)
我没有真正查看过缓存选项,我会自己从数据库中获取数据,但只是在一段时间过后。
通常你在Action范围内工作,下一级是Session,最全局的是Application。测试它的一种简单方法是创建一个实现ApplicationAware的Action类。然后你可以从任何jsp / action获取放在那里的值......你可以到达ActionContext的任何地方(最常见的地方)参见:http://struts.apache.org/2.0.14/docs/what-is-the-actioncontext.html
无论如何,我会实现一个基本拦截器,它会检查新数据是否可用,我还没有查找,然后加载新数据(触发此拦截器的用户可能不需要这些新数据,所以这样做在一个新的线程中是个好主意。)
这种方法增加了复杂性,因为您负责管理一些数据结构并使它们与ORM合作。
我这样做是为了从表中加载数据,这些数据永远不需要再次加载,而且数据就是它自己的(我不需要找到它与其他表之间的关系)。这是快速和肮脏的,史蒂文斯解决方案更加强大,并且可能会在以后需要进一步提高性能时向您付款。
答案 1 :(得分:1)
这根本不是特定于Struts2的。您绝对不想尝试将此信息存储在ActionContext
中 - 这是一个每请求对象。
你应该研究一下像EHCache这样的缓存框架。如果您使用Hibernate进行持久化,Hibernate可以选择缓存数据,这样就不需要在每次请求时都访问数据库。 (Hibernate也可以将EHCache用于其二级缓存)。
答案 2 :(得分:0)
如前所述,最好的方法是使用EHCache或其他一些可信任的缓存管理器。
另一种方法是使用工厂来访问信息。例如,有些东西:
public class MyCache {
private static MyCache cache = new MyCache();
public static MyCache getCache() {
return cache;
}
(data members)
private MyCache() {
(update data members)
}
public synchronized getXXX() {
...
}
public synchronized setXXX(SomeType data) {
...
}
}
您需要确保同步所有读写操作,以确保在更新缓存时没有竞争条件。
synchronized (MyCache.getCahce()) {
MyCahce.getCache().getXXX();
MyCache.getCache().getTwo();
...
}
等
同样,最好使用EHCache或其他交钥匙,因为如果没有对机制的充分理解,这可能会变幻无常。这种缓存也存在性能问题,因为它一次只允许一个线程读/写缓存。 (加速的可能方法是使用线程本地和读/写锁 - 但是已经在许多已建立的缓存管理器中构建了这种东西)