假设我有多个REST应用程序,我需要存储应用程序将维护的相当有限的数据(CRUD)并按用户请求处理数据。数据总是足够小,以便将其保留在内存中,这是一个很大的性能提升,也更容易数据操作,因为它直接是java对象。作为奖励,它使websocket-push实现变得更加容易。
但是,此数据必须持久(在关机或崩溃后可用),并且还可通过网络连接(缩放)提供给其他服务器。
实现此目标的一种方法是使用PostgreSQL
的{{1}}功能和JSON
功能。或者我猜一个具有某种通知功能的NoSQL数据库也可以。那些需要在每个表周围有很多样板代码/ SQL。我更喜欢有一些更简单的东西或者为我做的包装。
我头脑中的一个例子:
Notify
当然,这只是一种可能带来许多挑战的方法。它可能是一个不同的实现。这样的东西可用吗?或者可以使用上面的方法轻松编写包装器,如public class MyRestResource {
// This map will be updated realtime if any other service updates it; and when it's updated it will update the database.
private Map<String, MyPojo> myPojos;
public MyRestResource(PojoSynchronizer pojoSynchronizer){
// getTable will return a special Map implementation with events and triggers and being observed by the pojoSynchronizer.
this.myPojos = pojoSynchronizer.getTable("myPojos", MyPojo.class);
}
}
?
答案 0 :(得分:1)
也许你不需要这个框架。我们可以在您的类中使用Serializable接口,并为您的对象图执行类似的操作,您需要在关闭之前保留它。
try{
FileOutputStream fout = new FileOutputStream("my-data.ser");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(myRootObject);
oos.close();
System.out.println("Done");
} catch(Exception ex){
ex.printStackTrace();
}
要为您的应用程序构建对象图,您需要一个RootObject,其中包含一个或多个Map,ArrayList,Tree或更具体的内容。
要读取程序启动时的数据,可以使用ObjectInputStream readObject方法http://docs.oracle.com/javase/8/docs/api/java/io/ObjectInputStream.html
另请参阅:http://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html
答案 1 :(得分:0)
多年前,我使用prevayler作为非数据库Web应用程序。它非常快!它使用POJO。易于理解和实施。
数据结构非常简单。将其视为具有默认节点的树。 Prevayler知道树的根,并将数据添加到此根对象。您可以将树的快照作为备份机制。您甚至可以使用XML快照。
Prevailer是一个故障保护,因为它将更改写入磁盘,然后更新树。因此,即使断电,当您启动系统时,它会读取日志并重新创建它停止的位置
Prevayler是此类中的第一个。我相信还有其他库。在决定选择哪一项之前,先进行一些研究。
我希望它有所帮助。 =]
答案 2 :(得分:0)
根据@ Chloe对Oracle-Coherence
的评论,我得出结论,我所寻找的概念是In-Memory Data Grid
。有variety of tools有用,例如Hazelcast
,EhCache
,Infinispan
等等,这可能有所帮助。
Config cfg = new Config();
HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
Map<Integer, String> mapCustomers = instance.getMap("customers");