ssas连接mysql_Web服务器(Websphere、Tomcat)使用olap4j连接多维数据库(Ssas)
最近项目需要使用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
2)jdbc数据源配置 数据库存储器help类名 com.ibm.websphere.rsadapter.GenericDataStoreHelper 定制属性:一般是DriverAdapderCPDS类的属性
url:jdbc:xmla:Server=http://10.20.14.110/olap/msmdpump.dll;Catalog=olaptest driver:org.olap4j.driver.xmla.XmlaOlap4jDriver
到此为止,再加上配个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版本编写。
ssas连接mysql_Web服务器(Websphere、Tomcat)使用olap4j连接多维数据库(Ssas)相关推荐
- 远端服务器无响应请检查网络,连接远程服务器超时请检查网络连接
连接远程服务器超时请检查网络连接 内容精选 换一换 如果获取到的异常堆栈出现"System.Net.WebException: 无法连接到远程服务器 --->System.Net.So ...
- 自动连接 无法连接网络连接服务器,微信提示无法连接到服务器怎么办?微信无法连接服务器怎么解决?...
本文就微信提示无法连接到服务器怎么办?微信无法连接服务器怎么解决?简单介绍一下解决方法. 1.更换接入点,重新连接网络: 2.单击手机上的Menu键,然后选择"设置": 3.单击& ...
- 本地连接git 服务器方式:以及git连接时报错
第一:下载git 客户端 在客户端下载安装Git,在需要的地方打开 Git Bash Here 第二:连接git服务器,下载代码: 配置git:(在git bash 上配置) $ git conf ...
- asmr刷新失败无法连接上服务器_App Store显示无法连接怎么解决?两个步骤足够了...
不少iPhone用户在使用App Store的时候都遇到过这样的情况:"无法连接到APP Store",一般是可以通过强制刷新来解决,不过为什么会出现这样的情况呢? 为什么App ...
- appscan无法连接到服务器_对于csgo无法连接到任意服务器解决办法
csgo连接到任意官方服务器失败 对于这个问题,我自己碰到过.网上也查了多种方法,但是发现并不没有用或者非常麻烦.我自己摸索出一套相对简单了,而且对我来说有效的方法.由于最近在摸索东西,我安装了个电脑 ...
- 华为系统移动数据连接到服务器,怎样设置手机数据连接到服务器配置
怎样设置手机数据连接到服务器配置 内容精选 换一换 GaussDB(for MySQL)全兼容MySQL协议,因此,连接GaussDB(for MySQL) 实例有普通连接和SSL连接.其中,SSL连 ...
- 手机开锁显示无法连接到服务器是什么问题,苹果手机连接服务器失败原因 苹果手机连接服务器失败是什么原因...
1.验证失败连接apple id服务器时出错,想登录Apple ID账号却无法实现与苹果iCloud服务器连接是什么原因导致的呢?验证失败连接apple id服务器时出错原因分析:一般可能是由于手机网 ...
- 套接字的连接(服务器与客户端一对一的连接)
套接字:是一种通信机制,通过这种机制,客户/服务器系统的开发工作既可以在本机可以络进行. 注:套接字的创建和使用与管道是有区别的,套 ...
- ubuntu系统如何连接到服务器,远程ubuntu系统怎么连接到服务器
远程ubuntu系统怎么连接到服务器 内容精选 换一换 Ubuntu服务器通过Windows操作系统上的虚拟机安装的场景下,需要在Windows操作系统上安装USB网卡驱动,即RNDIS(Remote ...
最新文章
- Nat. Commun. | 深度学习探索可编程RNA开关
- python基础教程:3种控制流语句(if,for,while)
- 了解CSS核心精髓(一)
- MySQL影响性能的因素
- [No0000D6]端口-进程查询.bat
- Java网络编程——UDP编程
- 信息化和信息系统-PMP
- Tableau——备注
- 认识即时通讯开发通信协议之MQTT
- PS网页设计教程XVII——在Photoshop中设计创意组合网页
- html中padding在ie8兼容性,怎么解决bootstrap在各版本IE浏览器中的兼容性问题?
- 机器学习综述——机器学习理论基础与发展脉络
- 别用老派交易员眼光看市场回调
- 超级计算机在日常生活中有哪些有趣的应用
- asp 更新 mysql数据库_asp update mysql数据库
- ITU-T E.800
- 【机器人】谐波减速器和RV减速器的自我理解
- 将python代码打印成pdf
- Clinical-grade computational pathology using weakly supervised deep learning on whole slide images
- 大数据存储引擎 NoSQL极简教程 An Introduction to Big Data: NoSQL