这本质上是一个设计模式的问题:使用静态对象而不是数据库会是错误的吗?
我期待查询数据库以获取股票(股票/证券无论什么)的列表,对于给定的股票是高度相关的。
相反,我想也许我应该创建一个具有静态HashMap的对象并将我的数据存储在那里。然后在每次需要时“查询”它。
这种方法会不会有什么问题,因为我相信它会显着提高查询数据库相同数据的性能。数据量相对较小,不会增长,因此不会造成问题。可能有什么问题会在晚些时候咬我?
这本质上是一个设计模式的问题:使用静态对象而不是数据库会是错误的吗?
我期待查询数据库以获取股票(股票/证券无论什么)的列表,对于给定的股票是高度相关的。
相反,我想也许我应该创建一个具有静态HashMap的对象并将我的数据存储在那里。然后在每次需要时“查询”它。
这种方法会不会有什么问题,因为我相信它会显着提高查询数据库相同数据的性能。数据量相对较小,不会增长,因此不会造成问题。可能有什么问题会在晚些时候咬我?
我仍然会使用数据库作为备份的原因,但客户端使用像oscache这样的缓存API来将数据存储在本地文件系统中以便快速访问,然后如果系统关闭,则从数据库和继续使用代码中的缓存
这种方法一般没有问题。只要确保你不直接访问你的静态类,因为你创建了一个“bad singleton”。 (像一个全局变量)
反而引入某种注册机制来注册该类的所有对象将查询它。比你会有一个“好单身人士”,并且不会再有问题。
public class MyDataClass {
private MyDataClass() { }
public static MyDataClass getInstance() {
if (instance == null) instance = new MyDataClass();
return instance;
}
private static MyDataClass instance = null;
}
public class MyDataProcessor {
public void registerData(MyDataClass data) {
this.data = data;
}
public void process() {
assert(data != null);
data.getData(...);
}
private MyDataClass data;
}
当然,这种方法可能有一些问题,毕竟一个架构层上,当涉及到持久性,稳健性,...也许这将是更好地使用数据库与缓存层,但高度依赖关于用户的实际需求。
当你说不直接访问静态类 - 你的意思是不直接访问HashMap。我创建了get和set方法的等价物。这是你指的是什么? – Ankur 2009-05-03 09:38:47
不,这不是我的意思。我添加了一个例子。 – 2009-05-03 14:01:26
您的方法存在的问题是代码和数据之间没有分离。
导致一些缺点:
正如你似乎并不需要关系数据库,我建议你使用嵌入式的键值数据库,如BerkeleyDB,这也是非常快的。
如果数据确实发生变化并且您需要每次更新散列并重新编译,那么您将遇到的问题是。
这就是说,你知道数据,你可以知道这会影响你多少。
一个选择可能是您将数据保存在数据库中,但将其缓存到HashMap中。
通常返回并咬人的是假设某物永远不会改变。因此,如果您以后获得涉及更新值的要求,添加新的要求并让多个客户端访问数据(如果您已经在使用数据库),则您的工作量会减少。相反,请在客户端进行缓存以获得性能提升。只是我的2c。
如果更容易,将数据存储在HashMap中。
然后,您可以使用XStream将此副本串行化。这将创建一个HashMap对象的XML版本。
因此,您的应用程序可以根据需要将其写入磁盘,您可以手动编辑它并将其重新加载到应用程序中。这意味着你有你的HashMap,并且可以根据需要更改磁盘上的可配置表示。
静态缓存可以工作。
请记住,如果您有多个应用程序访问同一个数据库,你将需要某种形式的通讯总线和distributed cache
如果只读缓存没有得到自动更新是所有你需要为你应用程序,那么这种方法没有任何问题。但是,有一点需要注意:如果数据量(包括Java对象和HashMap的开销)变得太大而无法完全保存在RAM中,则性能会迅速而剧烈地下降(降低10,000倍或更多)。数据库系统旨在高效访问磁盘上的数据;一个HashMap不是。
你应该使用缓存吗?是的,如果速度要快得多,要么永远不想更新数据,要么缓存的数据与实际数据不是最新的并不重要。
你应该把这个访问放在一个API后面,并且隐藏抽象背后的缓存。然后你可以使用不同的缓存策略,或者放弃完全缓存的想法,而不必每次都重写其余的代码。
你的想法并不是那么糟糕,但我个人会选择一个缓存解决方案。
忽略那些认为每次数据更改时都需要重新编译/重新分配的人,因为我不认为他们明白静态的含义。即他们认为您将在您的来源中硬编码这些值。
再一次,根据你做什么,这可能是好的。只要在服务器维护/关闭的情况下,您有某种方法来保持HashMap或类似内容中的内容。
所有你需要的是一个序列化方法。我看到上面提到了XStream。
还有一个库叫Prevayler。这会即时序列化更改,但可让您将所有内容都保存在内存中。所以即使在没有时间正常关机的突然停电的情况下,这也可能有用。
使用不同的方法进行实验,看看哪些方法适合您,并在DAO后面提取详细信息。
+1数据库全是关于管理的。它不被称为RDBMS相关的数据库管理系统。 但是,如果您始终没有读/写事务,则将数据库加载到内存结构中可以大大提高速度。我曾经在一家公司每周只更新一次数据库。 – 2009-05-03 09:37:59