最近项目需要使用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)相关推荐

  1. 远端服务器无响应请检查网络,连接远程服务器超时请检查网络连接

    连接远程服务器超时请检查网络连接 内容精选 换一换 如果获取到的异常堆栈出现"System.Net.WebException: 无法连接到远程服务器 --->System.Net.So ...

  2. 自动连接 无法连接网络连接服务器,微信提示无法连接到服务器怎么办?微信无法连接服务器怎么解决?...

    本文就微信提示无法连接到服务器怎么办?微信无法连接服务器怎么解决?简单介绍一下解决方法. 1.更换接入点,重新连接网络: 2.单击手机上的Menu键,然后选择"设置": 3.单击& ...

  3. 本地连接git 服务器方式:以及git连接时报错

    第一:下载git 客户端 在客户端下载安装Git,在需要的地方打开  Git  Bash Here 第二:连接git服务器,下载代码: 配置git:(在git bash 上配置) $ git conf ...

  4. asmr刷新失败无法连接上服务器_App Store显示无法连接怎么解决?两个步骤足够了...

    不少iPhone用户在使用App Store的时候都遇到过这样的情况:"无法连接到APP Store",一般是可以通过强制刷新来解决,不过为什么会出现这样的情况呢? 为什么App ...

  5. appscan无法连接到服务器_对于csgo无法连接到任意服务器解决办法

    csgo连接到任意官方服务器失败 对于这个问题,我自己碰到过.网上也查了多种方法,但是发现并不没有用或者非常麻烦.我自己摸索出一套相对简单了,而且对我来说有效的方法.由于最近在摸索东西,我安装了个电脑 ...

  6. 华为系统移动数据连接到服务器,怎样设置手机数据连接到服务器配置

    怎样设置手机数据连接到服务器配置 内容精选 换一换 GaussDB(for MySQL)全兼容MySQL协议,因此,连接GaussDB(for MySQL) 实例有普通连接和SSL连接.其中,SSL连 ...

  7. 手机开锁显示无法连接到服务器是什么问题,苹果手机连接服务器失败原因 苹果手机连接服务器失败是什么原因...

    1.验证失败连接apple id服务器时出错,想登录Apple ID账号却无法实现与苹果iCloud服务器连接是什么原因导致的呢?验证失败连接apple id服务器时出错原因分析:一般可能是由于手机网 ...

  8. 套接字的连接(服务器与客户端一对一的连接)

    套接字:是一种通信机制,通过这种机制,客户/服务器系统的开发工作既可以在本机可以络进行.                                   注:套接字的创建和使用与管道是有区别的,套 ...

  9. ubuntu系统如何连接到服务器,远程ubuntu系统怎么连接到服务器

    远程ubuntu系统怎么连接到服务器 内容精选 换一换 Ubuntu服务器通过Windows操作系统上的虚拟机安装的场景下,需要在Windows操作系统上安装USB网卡驱动,即RNDIS(Remote ...

最新文章

  1. Nat. Commun. | 深度学习探索可编程RNA开关
  2. python基础教程:3种控制流语句(if,for,while)
  3. 了解CSS核心精髓(一)
  4. MySQL影响性能的因素
  5. [No0000D6]端口-进程查询.bat
  6. Java网络编程——UDP编程
  7. 信息化和信息系统-PMP
  8. Tableau——备注
  9. 认识即时通讯开发通信协议之MQTT
  10. PS网页设计教程XVII——在Photoshop中设计创意组合网页
  11. html中padding在ie8兼容性,怎么解决bootstrap在各版本IE浏览器中的兼容性问题?
  12. 机器学习综述——机器学习理论基础与发展脉络
  13. 别用老派交易员眼光看市场回调
  14. 超级计算机在日常生活中有哪些有趣的应用
  15. asp 更新 mysql数据库_asp update mysql数据库
  16. ITU-T E.800
  17. 【机器人】谐波减速器和RV减速器的自我理解
  18. 将python代码打印成pdf
  19. Clinical-grade computational pathology using weakly supervised deep learning on whole slide images
  20. 大数据存储引擎 NoSQL极简教程 An Introduction to Big Data: NoSQL

热门文章

  1. Windows Server 2008R2 TLS 升级到v1.2
  2. 蓝桥杯 历届真题 古堡算式【省赛】【本科组】
  3. centos m4安装linux,Centos Docker环境下安装Dcm4che归档服务
  4. 22考研:考取985、211名校的忠告!
  5. 我们应该怎样做时间管理?
  6. 【利用MMdetection3D框架进行单目3D目标检测(smoke算法】
  7. 最近有公司的大数据哥们反馈OKI是0
  8. Linux基础学习---1、目录结构、Vim编辑器、网络配置和远程登录
  9. 什么是区块链?区块链相关知识区入门
  10. 车云链总经理赵大宝接待房车露营专委会秘书长吴宝忠