<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.b-kaempgen.de/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.b-kaempgen.de/index.php?action=history&amp;feed=atom&amp;title=Olap4j-xmlaserver</id>
		<title>Olap4j-xmlaserver - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.b-kaempgen.de/index.php?action=history&amp;feed=atom&amp;title=Olap4j-xmlaserver"/>
		<link rel="alternate" type="text/html" href="http://www.b-kaempgen.de/index.php?title=Olap4j-xmlaserver&amp;action=history"/>
		<updated>2026-05-25T05:28:56Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.22.2</generator>

	<entry>
		<id>http://www.b-kaempgen.de/index.php?title=Olap4j-xmlaserver&amp;diff=581&amp;oldid=prev</id>
		<title>Benedikt Kämpgen: 1 revision: From LD-Cubes</title>
		<link rel="alternate" type="text/html" href="http://www.b-kaempgen.de/index.php?title=Olap4j-xmlaserver&amp;diff=581&amp;oldid=prev"/>
				<updated>2023-01-04T13:24:16Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision: From LD-Cubes&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 13:24, 4 January 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Benedikt Kämpgen</name></author>	</entry>

	<entry>
		<id>http://www.b-kaempgen.de/index.php?title=Olap4j-xmlaserver&amp;diff=580&amp;oldid=prev</id>
		<title>Benedikt Kämpgen at 14:19, 25 July 2014</title>
		<link rel="alternate" type="text/html" href="http://www.b-kaempgen.de/index.php?title=Olap4j-xmlaserver&amp;diff=580&amp;oldid=prev"/>
				<updated>2014-07-25T14:19:23Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Info==&lt;br /&gt;
* Download: https://github.com/olap4j/olap4j-xmlaserver&lt;br /&gt;
* We use a slightly changed fork from: https://github.com/bkaempgen/olap4j-xmlaserver&lt;br /&gt;
* Introductory mail by Julian: http://marc.info/?l=mondrian&amp;amp;m=134669820201700&amp;amp;w=2&lt;br /&gt;
* Based on [[XML for Analysis]]&lt;br /&gt;
&lt;br /&gt;
==Tipps for installation==&lt;br /&gt;
* Install:&lt;br /&gt;
** git clone git://github.com/olap4j/olap4j-xmlaserver.git&lt;br /&gt;
** Import into Eclipse as Java Project&lt;br /&gt;
** Add Dynamic Web Project Facet &lt;br /&gt;
** Make src/main/java as source folder&lt;br /&gt;
** Maven: see ( mvn clean install&lt;br /&gt;
** Deployment assembly, library: olap4j, olap4ld added&lt;br /&gt;
* I manually created a dynamic web project in Eclipse&lt;br /&gt;
* In there, I copied all files from olap4j-xmlaserver master&lt;br /&gt;
* Then I manually added libraries to WEB-INF/lib that xmlaserver relied upon:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
commons-collections.jar&lt;br /&gt;
&lt;br /&gt;
commons-dbcp.jar&lt;br /&gt;
&lt;br /&gt;
commons-pool.jar&lt;br /&gt;
&lt;br /&gt;
log4j.jar&lt;br /&gt;
&lt;br /&gt;
nxparser-1.2.3.jar&lt;br /&gt;
&lt;br /&gt;
olap4j-xmlaserver-0.0.1-SNAPSHOT.jar&lt;br /&gt;
&lt;br /&gt;
saxon-9.2.jar&lt;br /&gt;
&lt;br /&gt;
servlet-api.jar&lt;br /&gt;
&lt;br /&gt;
xercesImpl.jar&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example web.xml to connect with olap4ld===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;web-app&amp;gt;&lt;br /&gt;
	&amp;lt;display-name&amp;gt;XMLA Server&amp;lt;/display-name&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;servlet&amp;gt;&lt;br /&gt;
		&amp;lt;servlet-name&amp;gt;xmla&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
		&amp;lt;servlet-class&amp;gt;mondrian.xmla.impl.Olap4jXmlaServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverUsePreConfiguredDiscoverDatasourcesResponse&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverDiscoverDatasources.dataSourceName&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;[XMLA olap4ld]&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverDiscoverDatasources.dataSourceInfo&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;[LdCatalogSchema]&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverDiscoverDatasources.url&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;@datasourceUrl@&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverDiscoverDatasources.providerType&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;TDP&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverDiscoverDatasources.authenticationMode&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;Unauthenticated&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverMaxNumConnectionsPerUser&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;15&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
				&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverClassName&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;org.olap4j.driver.olap4ld.Olap4ldDriver&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionString&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;jdbc:ld://olap4ld;Catalog=LdCatalog;JdbcDrivers=com.mysql.jdbc.Driver;Server=http://;Database=EMBEDDEDSESAME;Datastructuredefinitions=;Datasets=;&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.Prefix&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;@connectionPrefix@&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.FetchLevelProperties&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.FetchMemberProperties&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.FetchMembers&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.QueryTimeoutMs&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;@queryTimeout@&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.AuthenticationProvider&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;com.someotherclass.XmlaAuthenticationProvider&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.ConnectionTimeoutMs&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;@connectionTimeout@&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.TotalCellLimit&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;@totalCellLimit@&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.PerPivotCellLimit&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;@perPivotCellLimit@&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
		&amp;lt;init-param&amp;gt;&lt;br /&gt;
			&amp;lt;param-name&amp;gt;OlapDriverConnectionProperty.Source&amp;lt;/param-name&amp;gt;&lt;br /&gt;
			&amp;lt;param-value&amp;gt;Excel&amp;lt;/param-value&amp;gt;&lt;br /&gt;
		&amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;IdleConnectionsTimeoutMinutes&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;@idleConnectionCleanupTimeout@&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;EnableConnectionReuse&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;@enableConnectionsReuse@&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
            &amp;lt;param-name&amp;gt;EnableCubesMetadataPrefetch&amp;lt;/param-name&amp;gt;&lt;br /&gt;
            &amp;lt;param-value&amp;gt;@enableCubesMetadataPrefetch@&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
	&amp;lt;/servlet&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
		&amp;lt;servlet-name&amp;gt;xmla&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
		&amp;lt;url-pattern&amp;gt;/xmla/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
	&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
&amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required modification: proper restriction to discover requests===&lt;br /&gt;
* xmla-server would not add proper restrictions to discover requests which would not allow olap4ld&lt;br /&gt;
to know the cube to query. (in RowsetDefinition).&lt;br /&gt;
&lt;br /&gt;
===Required modification: cube name pattern wildcard===&lt;br /&gt;
* Problem: Apparently, since cube name pattern (restrictions) is a wildcard, a list of values is stored. Therefore,&lt;br /&gt;
when querying for cubes in xmla-server, I check whether restrictions is a list:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
				// Get cube manually&lt;br /&gt;
				Iterable&amp;lt;Cube&amp;gt; cubelist;&lt;br /&gt;
				// We have to consider that with xmla4js, this always is a list.&lt;br /&gt;
				String cubename;&lt;br /&gt;
				if (this.restrictions&lt;br /&gt;
						.get(&amp;quot;CUBE_NAME&amp;quot;) instanceof List) {&lt;br /&gt;
					List cuberestrictionlist = (List) this.restrictions&lt;br /&gt;
							.get(&amp;quot;CUBE_NAME&amp;quot;);&lt;br /&gt;
					cubename = cuberestrictionlist.get(0).toString();&lt;br /&gt;
				} else {&lt;br /&gt;
					cubename = this.restrictions&lt;br /&gt;
							.get(&amp;quot;CUBE_NAME&amp;quot;).toString();&lt;br /&gt;
				}&lt;br /&gt;
				if (cubename != null) {&lt;br /&gt;
					Cube mycube = schema.getCubes().get(&lt;br /&gt;
							cubename);&lt;br /&gt;
					ArrayList&amp;lt;Cube&amp;gt; newlist = new ArrayList&amp;lt;Cube&amp;gt;();&lt;br /&gt;
					newlist.add(mycube);&lt;br /&gt;
					cubelist = newlist;&lt;br /&gt;
				} else {&lt;br /&gt;
					cubelist = filter(sortedCubes(schema), cubeNameCond);&lt;br /&gt;
				}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Problem: Pooling of data sources===&lt;br /&gt;
* After some queries, we only get &amp;quot;Creating new connection for user [null] and session [&amp;lt;no_session&amp;gt;]&amp;quot;&lt;br /&gt;
and the program hangs.&lt;br /&gt;
* I try to create a test case that reproduces the problem. - *done*&lt;br /&gt;
* We now debug the problem:&lt;br /&gt;
** Apparently, if we run the Xmla-Testcase several times, we always run into a &amp;quot;deadlock&amp;quot;&lt;br /&gt;
** When this happens, we can suspend &amp;quot;Daemon Thread [http-8080-2] and see that probably&lt;br /&gt;
Object.wait (long) line: not available [native method] &lt;br /&gt;
GenericObjectPool$Latch(Object).wait()&lt;br /&gt;
GenericObjectPool.borrowObject() ... the problem is.&lt;br /&gt;
** Trial: Connection connection = bds.getConnection();&lt;br /&gt;
*** give bds maybe testOnBorrow = true;&lt;br /&gt;
* If I call the number of &amp;quot;Connect Olap4LdDriver.&amp;quot; logs, one can assume that it is about the 15 max&lt;br /&gt;
connections. Apparently, we create 15 connections, do not reuse any connections and do not close&lt;br /&gt;
others. &lt;br /&gt;
* &amp;quot;OlapConnection mondrian.xmla.impl.Olap4jXmlaServlet.Olap4jPoolingConnectionFactory.getConnection(String &lt;br /&gt;
catalog, String schema, String roleName, Properties props) throws SQLException&amp;quot; ist synchronisiert &lt;br /&gt;
(siehe  http://openbook.galileocomputing.de/javainsel9/javainsel_14_005.htm#mj1bb85cdbf7de3e53c2f4909006721fe5),&lt;br /&gt;
* Information about the most important pooling objects did not help, either:&lt;br /&gt;
** Basic Datasource: http://commons.apache.org/proper/commons-dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html&lt;br /&gt;
** Generic Object Pool: http://commons.apache.org/proper/commons-pool/api-1.6/org/apache/commons/pool/impl/GenericObjectPool.html&lt;br /&gt;
* I do not know how to add a new version of dbcp to xmlaserver (tried &lt;br /&gt;
* Also, olap4j-xmlaserver on git hub is down currently.&lt;br /&gt;
* Therefore, work around, we always create a new data source in xmlaserver&lt;br /&gt;
* More background info&lt;br /&gt;
** olap4j: http://www.olap4j.org/olap4j_fs.html#Connection_pooling&lt;br /&gt;
** Michele Rossi has also identified some problems.&lt;br /&gt;
&lt;br /&gt;
* Workaround in &amp;quot;OlapConnection mondrian.xmla.impl.Olap4jXmlaServlet.Olap4jPoolingConnectionFactory.getConnection(String catalog, String schema, String roleName, Properties props) throws SQLException&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            synchronized (datasourcesPool) {&lt;br /&gt;
                bds = datasourcesPool.get(dataSourceKey);&lt;br /&gt;
                // Workaround - simply close any bds&lt;br /&gt;
                if (bds != null) {&lt;br /&gt;
                	bds.close();&lt;br /&gt;
                	bds = null;&lt;br /&gt;
                }&lt;br /&gt;
                if (bds == null) {&lt;br /&gt;
                    bds = new BasicDataSource();&lt;br /&gt;
                    for (Map.Entry entry : connProperties.entrySet()) {&lt;br /&gt;
                        bds.addConnectionProperty(&lt;br /&gt;
                            (String) entry.getKey(),&lt;br /&gt;
                            (String) entry.getValue());&lt;br /&gt;
                    }&lt;br /&gt;
                    bds.setDefaultReadOnly(true);&lt;br /&gt;
                    bds.setDriverClassName(olap4jDriverClassName);&lt;br /&gt;
                    bds.setPassword(pwd);&lt;br /&gt;
                    bds.setUsername(user);&lt;br /&gt;
                    bds.setUrl(olap4jDriverConnectionString);&lt;br /&gt;
                    bds.setPoolPreparedStatements(false);&lt;br /&gt;
                    bds.setMaxIdle(maxPerUserConnectionCount);&lt;br /&gt;
                    bds.setMaxActive(maxPerUserConnectionCount);&lt;br /&gt;
                    bds.setMinEvictableIdleTimeMillis(&lt;br /&gt;
                        idleConnectionsCleanupTimeoutMs);&lt;br /&gt;
                    bds.setAccessToUnderlyingConnectionAllowed(true);&lt;br /&gt;
                    bds.setInitialSize(1);&lt;br /&gt;
                    bds.setTimeBetweenEvictionRunsMillis(60000);&lt;br /&gt;
                    if (catalog != null) {&lt;br /&gt;
                        bds.setDefaultCatalog(catalog);&lt;br /&gt;
                    }&lt;br /&gt;
                    datasourcesPool.put(dataSourceKey, bds);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benedikt Kämpgen</name></author>	</entry>

	</feed>