ssas连接mysql_Web服务器(Websphere、Tomcat)使用olap4j连接多维数据库(Ssas)

article/2025/9/20 1:06:02

最近项目需要使用Java连接到Sql Server多维数据库(Ssas)。在网上找到了一种通过可以通过IIS发布dll来作为jdbc连接串的方法,通过开源的olap4j的jar包,成功实现了类jdbc的方式连接到ssas。但实际应用中往往是通过web服务器的jdbc连接池的方式获得连接。 费了九牛二虎之力,终于成功在Tomcat和Websphere下实现了连接池。而当连接池成功创建以后,忽然发现,其实olap4j的数据库连接池和普通的数据库连接池根本没有什么两样,只是一方面受到olap4j官网的几句获得连接代码的影响(使我的方向定位在如何获得olapConnection上,而实际上如果定位在如何获得statement上将更会容易许多),另一方面由于olap4j有些方法没有被实现,使得有些时候报了错误以为就出错了。

一、Websphere下连接Ssas 在Tomcat下使用apache的dbcp的相关jar包的方式,通过dbcp获得OlapCollection

第一种:

1)JNDI配置

2)调用方式

BasicDataSource ds=(BasicDataSource)initCtx.lookup("java:comp/env/jdbc/ssasdb");

ds.setAccessToUnderlyingConnectionAllowed(true);

Connection conn = ds.getConnection();

ds.setAccessToUnderlyingConnectionAllowed(true);//从ds对象的私有方法中获得对象

DelegatingConnection connection = (DelegatingConnection) conn;

OlapWrapper wrapper = (OlapWrapper) connection.getInnermostDelegate();

OlapConnection olapConnection = wrapper.unwrap(OlapConnection.class);

OlapStatement stmt = (OlapStatement)olapConnection.createStatement();

CellSet cellSet = stmt.executeOlapQuery(sql);//sql为mdx语句

上面这段代码还可以用下面这段取代:

BasicDataSource ds=(BasicDataSource)initCtx.lookup("java:comp/env/jdbc/ssasdb");

GenericObjectPool pool = new GenericObjectPool(null);

ConnectionFactory factory = new DataSourceConnectionFactory(ds);

PoolableConnectionFactory poolableFactory = new PoolableConnectionFactory(factory, pool, null, null, false, true);

PoolingDataSource poolingDataSource = new PoolingDataSource(pool);

ds.setAccessToUnderlyingConnectionAllowed(true);

poolingDataSource.setAccessToUnderlyingConnectionAllowed(true);//与前面一句缺一不可。

Connection conn = ds.getConnection();

System.out.println("Sql Base Connection get Sucessful!");

DelegatingConnection connection = (DelegatingConnection) poolingDataSource.getConnection();

OlapWrapper wrapper = (OlapWrapper) connection.getInnermostDelegate();

第二种: 1)JNDI配置

注意:上面的配置中与一般的tomcat数据源配置不同,user和driver属性,这两个要必需是DriverAdapterCPDS类的属性。

2)调用方式

DriverAdapterCPDS ds=(DriverAdapterCPDS)initCtx.lookup("java:comp/env/jdbc/ssasdb");

Connection conn=ds.getPooledConnection().getConnection();

OlapStatement stmt = (OlapStatement)conn.createStatement();

CellSet cellSet = stmt.executeOlapQuery(sql);

二、Websphere下连接Ssas

1)jdbc提供程序配置

类路径

olap4j-1.0.0.445.jar

olap4j-tck-1.0.0.445.jar

olap4j-xmla-1.0.0.445.jar

commons-dbcp-1.2.1.jar

commons-pool-1.2.jar

commons-collections.jar

实现类名 org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS

7218057.html 

2)jdbc数据源配置 数据库存储器help类名 com.ibm.websphere.rsadapter.GenericDataStoreHelper 7218057.html 定制属性:一般是DriverAdapderCPDS类的属性

url:jdbc:xmla:Server=http://10.20.14.110/olap/msmdpump.dll;Catalog=olaptest driver:org.olap4j.driver.xmla.XmlaOlap4jDriver

7218057.html

到此为止,再加上配个jcc 认证(连接olap数据源的用户和密码),就可以测试连接了。 在连接成功时,Websphere会报GenericDataStoreHelper 正在使用的警告,但没发现这种警告对数据库连接有什么影响。

3)调用方式

DataSource ds=(javax.sql.DataSource)initCtx.lookup("jdbc/ssasdb");

Connection sc=ds.getConnection();

Class clazz=sc.getClass();

Method method=clazz.getDeclaredMethod("getJDBCImplObject");

method.setAccessible(true);

Connection oo=(java.sql.Connection)method.invoke(sc);

OlapStatement stmt = (OlapStatement)oo.createStatement();

CellSet cellSet = stmt.executeOlapQuery(sql);//这里使用java的反射机制获得OlapStatement对象。

在做到这一步之前,我曾经尝试过如何在Websphere中获得OlapCollection的对象,但最终没有成功,其实上面的getJDBCImplObject方法也只能获得ConnectionImpl类的对象,而该类只是个私有类,因此无法获得到该类的实例。

WebSphere在建立连接池时把ConnectionImpl对象封装在com.ibm.ws.rsadapter.jdbc.WSJdbcConnection类的受保护的属性connImpl中,而该属性是在WSJdbcConnection的构造方法中赋值的,而这个构造方法在class com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource类中被调用,并生成WSJdbcConnection对象。

我曾经尝试通过如下方式获得OlapCollection的对象,当我获得到dbcp的poolingDataSource时,我以为能够获得到Olapcollection,但最终获得的仍然是WSJdbcConnection的对象(其实想想也该如此):

Context context = new javax.naming.InitialContext();

DataSource ds = (javax.sql.DataSource)context.lookup("jdbc/ssasdb");

GenericObjectPool pool = new GenericObjectPool(null);

ConnectionFactory factory = new DataSourceConnectionFactory(ds);

PoolableConnectionFactory poolableFactory = new PoolableConnectionFactory(factory, pool, null, null, false, true);

PoolingDataSource poolingDataSource = new PoolingDataSource(pool);

poolingDataSource.setAccessToUnderlyingConnectionAllowed(true);

DelegatingConnection connection = (DelegatingConnection) poolingDataSource.getConnection();

Websphere把OlapConnection封装在WSJdbcConnection中(其实tomcat也把它封装在相应的自己实现类中,但可以通过设置factory属性修改这个封装类而已),这种封装将使得获得到这样的类的实例很困难(除非使用java的反射机制),但实际上,在这种机制下,一般的数据库的jdbc的connection并不需要显式地获得到这样的实例,其实WSJdbcConnection的相关数据库执行(增删改查等)方法都是调用被封装的实例的方法,而WSJdbcConnection只是为所有各种类型的数据库查询所提供的统一接口而已,并且WSJdbcConnection这个类也不需要显式地获得,只需要把它强转成Connection的实例即可。

只是Olap多维数据库的Olap4j驱动程序一般(指官方帮助)使用OlapStatement.excuteOlapQuery方法获得数据,并且获得的数据类型是CellSet,因此我最初认为只有通过这种方式获得OlapConnection,然后OlapStatement,才能获得到结果,因此花费了很大力气去获得OlapConnection,而这种对象被web服务器封装起来了,而且不同服务器的封装变量不同,获得到这样的对象并不容易。

其实根本没必要获得这样的对象,因为Olap4j与普通的数据库驱动程序其实是一回事,只是我使用了excuteOlapQuery方法而忽略了excuteQuery方法,而如果使用OlapConnection的excuteQuery方法,Olap4j与普通数据库驱动一样,我们不需要显式地获得OlapConnection对象,只需要使用WSJdbcConnection作为java.sql.Connection,然后getStatement,excuteQuery就可以了,只是需要把XmlaOlapStatement里的默认情况下未被实现的方法excuteQuery实现一下即可,只需在这个方法中使用excuteOlapQuery方法获得CellSet,然后把它转换成ResultSet即可。

其实还是对jdbc的机制(可能也包括Olap4j)不是很了解,导致绕了一个大大的圈子。

注:本文档基于olap4j1.0.445版本编写。


http://chatgpt.dhexx.cn/article/OdqjHdn7.shtml

相关文章

ssas连接mysql_BI-SSAS简介篇

一、是什么? SSAS是用于SQLServer数据库用于BI的组件,通过SSAS可以创建多维数据库,并在之上进行数据挖掘操作。本文我们主要介绍一些关于SSAS数据分析的知识。接下来就让我们来一起了解一下吧。 商业智能提供的解决方案能够从多种数据源获取数…

ssas连接oracle性能,Analysis Services(SSAS) 性能优化

1、聚合选项中添加聚合,以空间换时间提升性能。 如下图: 性能提升百分比越高,聚合数越高,生成的Cube越大,这就是以空间换时间。 2、修改SSAS服务器上的线程池配置选项、提升并发数。 通过X:\Program Files\Microsoft S…

大数据时代:SSAS从入门到放弃

大数据时代到来,如何从数据中提取、挖掘对业务发展有价值的信息,为业务决策提供有力依据,推动精益化化的企业管理。商业分析师通常会使用各种数据分析工具,例如Excel、Tableau和PowerBI等对数据进行分析。OLAP就经常被用于对接这类…

ssas连接mysql_SSAS系列基础知识

1、什么是Cube? 简单 Cube 对象由基本信息、维度和度量值组组成。 基本信息包括多维数据集的名称、多维数据集的默认度量值、数据源和存储模式等。维度是多维数据集中使用的实际维度组。所有维度都必须先在数据库的维度集合中定义,然后才能在多维数据集中引用。度量…

SSAS多维数据分析创建

一、Visual Studio简介 Microsoft在 SQL Server Analysis Services (SSAS) 中,可以方便地创建复杂的联机分析处理(OLAP) 和数据挖掘解决方案。Analysis Services 工具提供了设计、创建和管理来自数据仓库的多维数据集和数据挖掘模型的功能,还提供对 OLAP…

SSAS介绍

文章提纲 商业智能(BI, Business Intelligence)基本概念 SSAS(SQL Server Analysis Services)相关工具(开发、管理和客户端) 总结 一、商业智能(BI, Business Intelli…

SSAS教程(一)——SSAS简介

SSAS全称SQL Server Analysis Services。Analysis Services 是在决策支持和商业分析中使用的分析数据引擎,它为商业报表和客户端应用程序提供了企业级语义数据模型,比如Power BI、 Excel、 Reporting Services 以及其他数据可视化工具。只要是支持Analys…

Java数组的初始化

Java数组初始化 1 一维数组初始化2 二维数组初始化 1 一维数组初始化 public class ArrayDemo1 {public static void main(String[] args) {// 格式一(动态初始化)int[] arr1 new int[3]; // 数组的长度(这里为3)必须指定// 格式二(静态初始化)int[] arr2 new int[]{1, 2, 3…

java类初始数组_java中数组初始化的三种方式是什么

java中数组初始化的三种方式是:1、静态初始化,如【int a[] {2, 0, 1, 9, 2020}】;2、动态初始化,如【int[] c new int[4]】;3、默认初始化,如【int[]dnew int[5]】。 初始化方式: 1、静态初始…

Java数组初始化、赋值与输出

文章目录 Java数组相关知识数组初始化一维数组二维数组 数组输出一维数组二维数组 Java数组相关知识 数组初始化 一维数组 初始化为0 int[] a; a new int[5]; int[] b new int[5]; 初始化为指定值 int[] a new int[]{0,1,2,3,4};//正确 int[] b {0,1,2,3,4};//正确&a…

java初始化array_java数组初始化方式

在使用一个新的数组之前,要先对其中的数值进行设置,也就是我们常说的初始化工作。因为数组有长度和内容的区分,所以常见的两种初始化方法是动态和静态,另外一种就是默认初始化。下面我们对数组的初始化概念进行理解,区…

c++ lamuda表达式mutable

1.lambda表达式 C11引入了Lambda表达式。Lambda表达式的引入,方便了简短函数的定义,为常用的一次性函数的定义和使用提供了很大的便利。 Lambda表达式实际上是一种匿名函数定义,常用来定义简单和不重复使用的函数。其可使用的外部变量、定义方…

const和mutable关键字

const修饰变量表示改变量内容不可修改,在类中,const还可以修饰成员函数,修饰成员函数后就不可以更改成员变量了。 可以看出,this指针是const*const类型,既不可以修改其内容,也不能修改其指向。 想一下&…

C++的mutable

一、介绍 mutable的中文意思是“可变的,易变的”,正好与const相反。在C中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 二、用法 如果类的成员函数…

Scala集合的mutable和immutable解释

Scala集合的mutable和immutable解释 概述集合API概述 概述 Scala 集合类系统地区分了可变的和不可变的集合。可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。而不可变集合类,相比之下,永远不…

C++之mutable

mutable大概两种用法 第一种,若想在GetName中对一个私有成员变量进行更改,那么只能将其设置为mutable. class test { private:std::string m_name;mutable int m_count; public:const std::string & GetName() const{m_count;return m_name;} };…

mutable

1.mutable 关键字 (C) 字典意思 adj. 易变的,不定的;性情不定的 语法意思 如果需要在const成员方法中修改一个成员变量的值,那么需要将这个成员变量修饰为mutable。即用mutable修饰的成员变量不受const成员方法的限制。 可以认为mutable的变…

安装prophet

1、创建一个新的环境 按照官网的做法,创建一个新的python环境 激活这个环境。 2、安装C的编译工具 因为网速的问题,有一个包安装失败了,再次执行命令,发现安装会继续执行上次没完成的: 3、安装依赖库 4、安装pystan …

Facebook时序预测工具Prophet实战分析

引言 去年Facebook开源了一套时序预测工具叫做Prophet。Prophet是一个预测时间序列数 据的模型。 它基于一个自加性模型,用来拟合年、周、季节以及假期等非线性趋势。 它在至少有一年历史数据的日常周期性数据,效果最好。 Prophet对缺失值,趋…

Prophet代码实战(一)趋势项调节

这里写目录标题 Prophet Quick StartProphet的缺点数据格式建模流程 Prophet详解趋势线性趋势逻辑斯蒂趋势无趋势 检测和设置趋势的分段点分段点的检测和可视化趋势的置信区间 Prophet Quick Start Prophet的缺点 时间t上的观测值的分布只能是高斯分布无法高效处理大量相关时…