保持POJO跨服务器同步

时间:2015-07-03 22:25:59

标签: java database

假设我有多个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); } }

3 个答案:

答案 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有用,例如HazelcastEhCacheInfinispan等等,这可能有所帮助。

来自Hazelcast的

An example

    Config cfg = new Config();
    HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
    Map<Integer, String> mapCustomers = instance.getMap("customers");