saiku 元数据存储分析
一、介绍
使用saiku的人一定对他的元数据存储都特别感兴趣,特别是有分布式管理需求的项目,更是迫切需要了解。其实它是使用Apache的开源项目Jackrabbit管理文件的!
二、代码跟踪
我也是使用了一段时间,希望深入了解它的元数据存储,下面是代码跟踪:
2.1 ajax
首先还是从ajax入手:ajax请求:/saiku/rest/saiku/admin/datasources?_=1466478165922
@GET
@Produces( {"application/json"})
@Path("/datasources")
@ReturnType("java.lang.List<SaikuDatasource>")
public Response getAvailableDataSources()
2.2 代码注入
AdminResource对象注入:
<bean id="adminBean" class="org.saiku.web.rest.resources.AdminResource">
<property name="userService" ref="userServiceBean"/>
<property name="datasourceService" ref="datasourceServiceBean"/>
<property name="olapDiscoverService" ref="olapDiscoverServiceBean"/>
<property name="repositoryDatasourceManager" ref="repositoryDsManager"/>
<property name="logExtractor" ref="logwriterbean"/>
</bean>
UserService对象注入:
<bean id="userServiceBean" class="org.saiku.service.user.UserService">
<property name="jdbcUserDAO" ref="userDAO"/>
<property name="datasourceService" ref="datasourceServiceBean"/>
<property name="iDatasourceManager" ref="repositoryDsManager"/>
<property name="adminRoles">
<list>
<value>ROLE_ADMIN</value>
</list>
</property>
<property name="sessionService" ref="sessionService"/>
</bean>
DatasourceService对象注入:
<bean id="datasourceServiceBean" class="org.saiku.service.datasource.DatasourceService">
<property name="connectionManager" ref="connectionManager"/>
</bean>
发现部分核心代码:
private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
datasources = connectionManager.getDataSourceManager();
}
继续跟踪:
connectionManager对象注入:
<bean id="connectionManager" class="org.saiku.web.core.SecurityAwareConnectionManager" init-method="init"
destroy-method="destroy" depends-on="mondrianVFS">
<property name="dataSourceManager" ref="repositoryDsManager"/> --这是注入执行setDataSourceManager方法,传入repositoryDsManager对象
<property name="sessionService" ref="sessionService"/>
</bean>
repositoryDsManager对象注入:
<bean id="repositoryDsManager" class="org.saiku.service.datasource.RepositoryDatasourceManager" init-method="load" destroy-method="unload">
<property name="userService" ref="userServiceBean"/>
<property name="configurationpath" value="../../repository/configuration.xml"/>
<property name="datadir" value="../../repository/data"/>
<property name="foodmartdir" value="../../data"/>
<property name="foodmartschema" value="../../data/FoodMart4.xml"/>
<property name="foodmarturl" value="jdbc:h2:../../data/foodmart;MODE=MySQL"/>
<property name="earthquakeDir" value="../../data"/>
<property name="earthquakeSchema" value="../../data/Earthquakes.xml"/>
<property name="earthquakeUrl" value="jdbc:h2:../../data/earthquakes;MODE=MySQL"/>
<property name="repoPasswordProvider" ref ="repoPasswordProviderBean"/>
<property name="defaultRole" value="ROLE_USER"/>
<!-- If you change the repoPassword set this property for at least 1 restart to update the old repo password-->
<!--<property name="oldRepoPassword" value="sa!kuanalyt!cs"/>-->
</bean>
获取所有的元数据,就是获取RepositoryDatasourceManager对象的datasources对象,这个对象是由下面的代码生成的:
public void load() {
irm = JackRabbitRepositoryManager.getJackRabbitRepositoryManager(configurationpath, datadir, repopasswordprovider.getPassword(),
oldpassword, defaultRole);
try {
irm.start(userService);
this.saveInternalFile("/etc/.repo_version", "d20f0bea-681a-11e5-9d70-feff819cdc9f", null);
} catch (RepositoryException e) {
log.error("Could not start repo", e);
}
datasources.clear();
try {
List<DataSource> exporteddatasources = null;
try {
exporteddatasources = irm.getAllDataSources();
} catch (RepositoryException e1) {
log.error("Could not export data sources", e1);
}
if (exporteddatasources != null) {
for (DataSource file : exporteddatasources) {
if (file.getName() != null && file.getType() != null) {
Properties props = new Properties();
SaikuDatasource.Type t = SaikuDatasource.Type.valueOf(file.getType().toUpperCase());
SaikuDatasource ds = new SaikuDatasource(file.getName(), t, props);
datasources.put(file.getName(), ds);
}
}
}
} catch (Exception e) {
throw new SaikuServiceException(e.getMessage(), e);
}
}
三、终极发现
saiku是使用JackRabbit管理树状元数据的,如果想要扩展,只能在JackRabbit基础上进行扩展,同志们继续努力!
JackRabbitIBM文档:http://www.ibm.com/developerworks/cn/java/j-jcr/
JackRabbit入门文档: http://suigara.iteye.com/blog/1454765
saiku 元数据存储分析的更多相关文章
- kafka系列四、kafka架构原理、高可靠性存储分析及配置优化
一.概述 Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cl ...
- Hadoop HDFS元数据目录分析
元数据目录分析 在第一次部署好Hadoop集群的时候,我们需要在NameNode(NN)节点上格式化磁盘: $HADOOP_HOME/bin/hdfs namenode -format 格式化完成之后 ...
- BCS--设置BDC元数据存储权限--访问被业务数据拒绝
设置元数据存储权限 http://blog.163.com/liangshan_wei@126/blog/static/8297850320139126930290/
- hive的本地安装部署,元数据存储到mysql中
要想使用Hive先要有hadoop集群的支持,使用本地把元数据存储在mysql中. mysql要可以远程连接: 可以设置user表,把localhost改为%,所有可连接.记住删除root其他用户,不 ...
- Salesforce的多态存储和SAP C4C的元数据存储仓库
Salesforce Force.com integrates and optimizes several different data persistence technologies to del ...
- Ceph分层存储分析
最近弄Ceph集群考虑要不要加入分层存储 因此花了点时间研究了下 1,首先肯定要弄清Ceph分层存储的结构 ,结构图大概就是下图所示 缓存层(A cache tier)为Ceph客户端提供更好的I/O ...
- MySQL、Oracle元数据抽取分析
最近接到个任务是抽取mysql和Oracle的元数据,大致就是在库里把库.schema.表.字段.分区.索引.主键等信息抽取出来,然后导成excel. 因为刚开始接触元数据,对这个并不了解,就想借助一 ...
- [saiku] 通过 saiku 的 DEMO 分析 connection
示例:FOODMART connection: foodmart catalog: FoodMart schema: FoodMart cube: Sales/HR/Sales 2/.../ ==== ...
- png的格式及像素存储分析
从图片的数据块存储方式来看png分两种 1.索引色模式存储.png8的索引色透明就采取该种方式.该种方式是将颜色存在png的可选模块调色板中,调色板的色彩存储格式为RGB(各1byte).而图片的数据 ...
随机推荐
- 39行代码实现JS HTML模板(轻量+高效+易用)
otmpl 是一个轻量级前端模版(仅有39行无压缩代码,支持缓存),所用指令仅需[#...#]和{#...#},前者包含需要输出html语句,后者包含js变量. 支持javascript完整语法,你可 ...
- Linux:Linux 重要人物
1.Ken Thompson:C 语言之父和 UNIX 之父 2.Dennis Ritchie:C 语言之父和 UNIX 之父 3.Stallman:著名黑客,GNU 创始人,开发了 Emacs.gc ...
- 【原】关于使用jieba分词+PyInstaller进行打包时出现的一些问题的解决方法
错误现象: 最近在做一个小项目,在Python中使用了jieba分词,感觉非常简洁方便.在Python端进行调试的时候没有任何问题,使用PyInstaller打包成exe文件后,就会报错: 错误原因分 ...
- Atitit. BigConfirmTips 控件 大数据量提示确认控件的原理and总结O9
Atitit. BigConfirmTips 控件 大数据量提示确认控件的原理and总结O9 1. 主要的涉及的技术 1 2. 主要的流程 1 3. 调用法new confirmO9t(); 1 4. ...
- paip.提升性能3倍--使用栈跟VirtualAlloc代替堆的使用.
paip.提升性能3倍--使用栈跟VirtualAlloc代替堆的使用. #----为什么要设计堆栈,它有什么独特的用途? 为了性能 .... 堆比栈的性能 也有的说法为了编程容易...这个是错误的 ...
- CentOS 6.5 无网环境安装R及Rstudio的方法的方法
在生产环节,一般是不联网的,下面介绍在无望环境如何安装R及R-studio 1. 安装CentOS for R语言的基础环境 1.1 libpng,X11,libjpeg等支持 yum -y ins ...
- 一些java面试题
1.SQL中的having子句用来干啥的? 答:having子句的功能是进行分组(GROUP BY)后的过滤 如:select id,avg(score) from 表 group by 学号 ha ...
- Android SQLite3工具常用命令行总结
Android SDK的tools目录下提供了一个sqlite3.exe工具,这是一个简单的sqlite数据库管理工具.开发者可以方便的使用其对sqlite数据库进行命令行的操作. 程序运行生成的*. ...
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- C#窗体全屏功能
最近有朋友让我给他弄个应用程序全屏的功能,例如银行的取号程序界面.所以我从网上查询了一些实现的方法. C#应用程序中如何实现全屏幕显示功能? 效果就像windows自带的屏幕保护程序和众多的游戏那样, ...