jackrabbit使用总结:

    项目中,我需要管理树状内容,主要是包括主题树,仪表盘树,资源树等。。。。以及之间的关联。传统的做法是自定义关系模型,直接进行数据库存取。但考虑开发成本及程序的扩展性,采用了java的jcr实现,最终选用了jackrabbit。

    在使用中,遇到一些问题和自认为的一些关键点,不一定正确,但是记录了下来。


    问题1:JCR存储的初始化时,针对oracle,建表会失败。
    原因:DatabaseFileSystem.checkSchema() 中,使用 DatabaseMetaData.getTables()来判定是否存在相应的表,好象对oracle不生效,可能是登录用户的问题。
    解决办法:使用了系统表来判定是否有固定表名。
     如:我们的应用中,采用中间sql的专用系统表:
     SELECT count(1) FROM KSQL_USERTABLES WHERE KSQL_TABNAME='" + tableName + "'";

    问题2:执行statment时,有时会报错:提示con已关闭,然后会试图重取连接。
    原因:具体原因未找到,可能是我们的中间件的数据库连接管理 关闭了相应的connection。

    解决办法:因为原有实现的重连后会成功(重新获取connection),但重连会等待10秒,所以简单覆写了DatabasePersistenceManager.reestablishConnection ,不再需要等待10秒,而是直接重新获取connection。应该说,只是勉强解决了问题。

    问题3: jackrabbit的session是未做同步处理的,用户需要做并发的处理,否则,后果很严重。
    严重到什么程度呢?整个workspace的树装载会失败,因为索引建立会出错,也就是JCR的初始化都会失败。
    原因:其实手册上写得有,只是我没仔细看。这不算错误啦。
    解决办法:先我把问题搞错了,采用了池的方式来处理并发问题,但发现仍有问题,仔细一想,池只是解决了session的同步,但多个session中的内存存储可能由于并发,造成与实际存储(数据库)的不一致。这样仍然是有问题的。于是,最终还是改成了对所有写操作加了同步字,解决了这个大麻烦。

    问题4:session刚建立时,不能使用query,会得到错误的结果。
     原因:没找到。
    解决办法:只好将初始化和实际的使用分离,对于必须在一起操作的,要注意避免使用query,比如:封装的Node的getChildren,原来使用了query,后来改为了本身的getNode来获取。

    关键点点1: query的用法:
     /jcr:root//*[@ctrl:age=/"28/"]
     /jcr:root//*[jcr:like(name(),'a%g')]

    关键点2:如何同时支持多帐套.多工作空间
    1:配置文件采用动态生成,账套名称通过参数传入。
      <param name="dataCenter" value=""/> 

       这样,就可以根据不同账套,获取不同的连接了。
    2:不同工作空间采用不同的配置文件,保证单个配置文件只有一个工作空间。
       这样,就能比较容易的同时支持多个工作空间,且不产生冲突。

     关键点3:如何区分用户存储和系统存储
      这个,在纠错时比较重要。
      可以在所有结点/属性名称前 添加一个自定义的前缀如  :user:
      实际上,系统的存储会自动添加 jcr。这样,就可以区分开了。

 

      暂时就这些了。

 



 

你可能感兴趣的:(oracle,工作,数据库,session,存储,query)