2016-04-22 106 views
0

之前重新加載HSQLDB文件我有以下情形:使用相同in file hsqldb 力冬眠閱讀

  • app1

    • 兩個應用程序只寫從db到/刪除和app2只讀取它
    • app1信號(通過發送事件)app2db已更新時,他應該讀取新值
    • app2是不能夠讀出新的價值,他只看到老一

    我試圖寫:

    Session session = sessionFactory.getCurrentSession(); 
    try { 
        session.setFlushMode(FlushMode.AUTO); 
        session.saveOrUpdate(cluster); 
        session.flush(); 
        return true; 
    } catch (Exception e) { 
        LOG.error("Failed saving cluster {}!", cluster.getName(), e); 
        return false; 
    } 
    

    的閱讀:

    Session session = sessionFactory.getCurrentSession(); 
        session.setCacheMode(CacheMode.REFRESH); 
    
    try { 
        return (List<Cluster>) session 
           .createCriteria(Cluster.class) 
           .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
           .list(); 
        } catch (Exception e) { 
         LOG.error("Error while trying to read the clusters from file!", e); 
         return new ArrayList<>(); 
        } 
    

    但遺憾的是這並未」工作。

    我也嘗試關閉連接,然後重新打開,但這也不起作用。

    更新[1]:

    我只設置:

    basicDataSource.setDefaultTransactionIsolation(Isolation.READ_UNCOMMITTED.value()) 
    

    上的app2的一面,但即便如此,app2是不能夠讀出的更新。

  • +0

    在HSQLDB使用何種表類型連接? – Evgeny

    +0

    @Evgeny你是什麼意思的表類型?表格的組成? – Paul

    +0

    http://hsqldb.org/doc/guide/ch01.html#N1023C – Evgeny

    回答

    2

    HSQLDB documentstion狀態:

    Memory表是默認類型用於CREATE TABLE命令時。他們的數據完全保存在內存中,但其結構或內容的任何更改均寫入.script文件。 在下次打開數據庫時讀取腳本文件,並重新創建MEMORY表及其所有內容。

    由於兩個應用程序使用獨立存儲器表分貝狀態可以而不重啓同步。理論上,app2中的hsqldb實例可以通過關閉SHUTDOWN sql command來強制重新加載其狀態,並在聲明新連接時開始啓動。但它看起來不是一個好的解決方案。如果兩個實例試圖將它們的狀態保存到同一個文件中,也有可能發生衝突。

    我建議在Server mode中使用hsqldb更適合兩個應用程序使用一個db的情況。服務器模式可以在單獨的JVM instace上啓動,也可以作爲app1的一部分啓動。

    Server server = new Server(); 
    
    server.setDatabaseName(0, "test"); 
    server.setDatabasePath(0, "file:test"); 
    server.setLogWriter(new PrintWriter(System.out)); 
    server.setErrWriter(new PrintWriter(System.err)); 
    server.start(); 
    

    app2將能夠使用

    DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/test"); 
    
    +0

    謝謝,它的作品!我沒有使用'DriverManager'連接到'server',而是使用'DataSource',所以在我的代碼中沒有太多改變,只是增加了'server' – Paul