2009-05-03 14 views
5

这本质上是一个设计模式的问题:使用静态对象而不是数据库会是错误的吗?

我期待查询数据库以获取股票(股票/证券无论什么)的列表,对于给定的股票是高度相关的。

相反,我想也许我应该创建一个具有静态HashMap的对象并将我的数据存储在那里。然后在每次需要时“查询”它。

这种方法会不会有什么问题,因为我相信它会显着提高查询数据库相同数据的性能。数据量相对较小,不会增长,因此不会造成问题。可能有什么问题会在晚些时候咬我?

回答

4

我仍然会使用数据库作为备份的原因,但客户端使用像oscache这样的缓存API来将数据存储在本地文件系统中以便快速访问,然后如果系统关闭,则从数据库和继续使用代码中的缓存

+0

+1数据库全是关于管理的。它不被称为RDBMS相关的数据库管理系统。 但是,如果您始终没有读/写事务,则将数据库加载到内存结构中可以大大提高速度。我曾经在一家公司每周只更新一次数据库。 – 2009-05-03 09:37:59

1

这种方法一般没有问题。只要确保你不直接访问你的静态类,因为你创建了一个“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; 
} 

当然,这种方法可能有一些问题,毕竟一个架构层上,当涉及到持久性,稳健性,...也许这将是更好地使用数据库与缓存层,但高度依赖关于用户的实际需求。

+0

当你说不直接访问静态类 - 你的意思是不直接访问HashMap。我创建了get和set方法的等价物。这是你指的是什么? – Ankur 2009-05-03 09:38:47

+0

不,这不是我的意思。我添加了一个例子。 – 2009-05-03 14:01:26

1

您的方法存在的问题是代码和数据之间没有分离。

导致一些缺点:

  • 你不能做备份
  • 你必须重新编译/重新部署应用程序更改数据

正如你似乎并不需要关系数据库,我建议你使用嵌入式的键值数据库,如BerkeleyDB,这也是非常快的。

1

如果数据确实发生变化并且您需要每次更新散列并重新编译,那么您将遇到的问题是。

这就是说,你知道数据,你可以知道这会影响你多少。

一个选择可能是您将数据保存在数据库中,但将其缓存到HashMap中。

1

通常返回并咬人的是假设某物永远不会改变。因此,如果您以后获得涉及更新值的要求,添加新的要求并让多个客户端访问数据(如果您已经在使用数据库),则您的工作量会减少。相反,请在客户端进行缓存以获得性能提升。只是我的2c。

0

如果更容易,将数据存储在HashMap中。

然后,您可以使用XStream将此副本串行化。这将创建一个HashMap对象的XML版本。

因此,您的应用程序可以根据需要将其写入磁盘,您可以手动编辑它并将其重新加载到应用程序中。这意味着你有你的HashMap,并且可以根据需要更改磁盘上的可配置表示。

0

静态缓存可以工作。

请记住,如果您有多个应用程序访问同一个数据库,你将需要某种形式的通讯总线和distributed cache

3

如果只读缓存没有得到自动更新是所有你需要为你应用程序,那么这种方法没有任何问题。但是,有一点需要注意:如果数据量(包括Java对象和HashMap的开销)变得太大而无法完全保存在RAM中,则性能会迅速而剧烈地下降(降低10,000倍或更多)。数据库系统旨在高效访问磁盘上的数据;一个HashMap不是。

0

你应该使用缓存吗?是的,如果速度要快得多,要么永远不想更新数据,要么缓存的数据与实际数据不是最新的并不重要。

你应该把这个访问放在一个API后面,并且隐藏抽象背后的缓存。然后你可以使用不同的缓存策略,或者放弃完全缓存的想法,而不必每次都重写其余的代码。

1

你的想法并不是那么糟糕,但我个人会选择一个缓存解决方案。

忽略那些认为每次数据更改时都需要重新编译/重新分配的人,因为我不认为他们明白静态的含义。即他们认为您将在您的来源中硬编码这些值。

0

再一次,根据你做什么,这可能是好的。只要在服务器维护/关闭的情况下,您有某种方法来保持HashMap或类似内容中的内容。

所有你需要的是一个序列化方法。我看到上面提到了XStream。

还有一个库叫Prevayler。这会即时序列化更改,但可让您将所有内容都保存在内存中。所以即使在没有时间正常关机的突然停电的情况下,这也可能有用。

使用不同的方法进行实验,看看哪些方法适合您,并在DAO后面提取详细信息。

相关问题