Исключением является получение соединения olap4j в Pentaho 5.2.
У меня есть два плагина Pentaho. Один сделан в GWT, работает в 5.0-5.2 и возвращает все необходимые мне размеры. Теперь мне нужен рефакторинг без gwt. Я поместил код соединения в мой новый REST-сервис, и код хорошо работает в Pentaho 5.0, но не работает в 5.2. Я полагаю, что проблема не в коде, но я пытаюсь понять, почему это терпит неудачу, если в службе gwt работают хорошо.
MondrianProperties pr = MondrianProperties.instance();
// Customize Mondrian to get connection
pr.setProperty("mondrian.rolap.ignoreInvalidMembers", "true");
pr.setProperty("mondrian.rolap.ignoreInvalidMembersDuringQuery", "true");
pr.DataSourceResolverClass.setString("org.pentaho.platform.web.servlet.PentahoDataSourceResolver");
Properties props = MondrianPropertyLoader.loadProperties();
for(String property: props.stringPropertyNames()) {
pr.setProperty(property, props.getProperty(property));
}
url = "jdbc:mondrian:Catalog=" + catalogDefinition + ";Datasource=" + dataSource; // + props;
Class.forName("mondrian.olap4j.MondrianOlap4jDriver");
// In Pentaho 5.2 RESTService fail
// ---------------------------------
OlapConnection connection = (OlapConnection) DriverManager.getConnection(url, "", "");
// ---------------------------------
final OlapWrapper wrapper = connection;
OlapConnection tmpolapConnectionStx = (OlapConnection) wrapper.unwrap(OlapConnection.class);
olapConnection = tmpolapConnectionStx;
//Roles stuff
setRoles(connection.getAvailableRoleNames());
connection = null;
Class.forName("mondrian.olap4j.MondrianOlap4jDriver");
url += ";Role=" + getStringRoles();
connection = (OlapConnection) DriverManager.getConnection(url, "", "");
final OlapWrapper wrapper2 = connection;
tmpolapConnectionStx = null;
tmpolapConnectionStx = (OlapConnection) wrapper2.unwrap(OlapConnection.class);
if (tmpolapConnectionStx == null) {
throw new Exception("Connection is null");
}
olapConnection = tmpolapConnectionStx;
this.initialized = true;
Предыдущий код одинаков для обоих, но новый сервис в Pentaho 5.2 на линии
Соединение OlapConnection = (OlapConnection) DriverManager.getConnection ...
сбой и выбросить следующие исключения с этим URL
JDBC: Мондриан: Каталог = Мондриан:/SampleData;Datasource=SampleData; Поставщик: Mondrian;EnableXmla: ложь
JDBC: Мондриан: Каталог = Мондриан: / SampleData; Datasource = SampleData
ERROR [PentahoDataSourceResolver] PentahoXmlaServlet.ERROR_0002 - IDatasourceService.UNABLE_TO_INSTANTIATE_OBJECT
org.pentaho.platform.api.data.DBDatasourceServiceException: DatasourceService.ERROR_0003 - Unable to get jndi datasource
at org.pentaho.platform.engine.services.connection.datasource.dbcp.NonPooledOrJndiDatasourceService.retrieve(NonPooledOrJndiDatasourceService.java:69)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.BaseDatasourceService.getDataSource(BaseDatasourceService.java:69)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.DynamicallyPooledOrJndiDatasourceService.resolveDatabaseConnection(DynamicallyPooledOrJndiDatasourceService.java:37)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.NonPooledOrJndiDatasourceService.retrieve(NonPooledOrJndiDatasourceService.java:51)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.BaseDatasourceService.getDataSource(BaseDatasourceService.java:69)
at org.pentaho.platform.web.servlet.PentahoDataSourceResolver.lookup(PentahoDataSourceResolver.java:43)
at mondrian.rolap.RolapConnection.createDataSource(RolapConnection.java:429)
at mondrian.rolap.RolapConnection.<init>(RolapConnection.java:135)
at mondrian.rolap.RolapConnection.<init>(RolapConnection.java:91)
at mondrian.olap.DriverManager.getConnection(DriverManager.java:113)
at mondrian.olap.DriverManager.getConnection(DriverManager.java:69)
at mondrian.olap4j.MondrianOlap4jConnection.<init>(MondrianOlap4jConnection.java:157)
at mondrian.olap4j.FactoryJdbc4Plus$AbstractConnection.<init>(FactoryJdbc4Plus.java:323)
at mondrian.olap4j.FactoryJdbc41Impl$MondrianOlap4jConnectionJdbc41.<init>(FactoryJdbc41Impl.java:118)
at mondrian.olap4j.FactoryJdbc41Impl.newConnection(FactoryJdbc41Impl.java:32)
at mondrian.olap4j.MondrianOlap4jDriver.connect(MondrianOlap4jDriver.java:134)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at com.olaphelper.provider.HelperConnection.connect(HelperConnection.java:101)
at com.olaphelper.provider.HelperConnection.isConnected(HelperConnection.java:55)
at com.olaphelper.api.rest.OlapResources.getCubeDimensions(OlapResources.java:98)
at com.olaphelper.api.rest.OlapResources$$FastClassByCGLIB$$767f2eeb.invoke(<generated>)
. . .
Caused by: org.pentaho.platform.api.data.DBDatasourceServiceException: javax.naming.NameNotFoundException: El nombre SampleData no este asociado a este contexto
at org.pentaho.platform.engine.services.connection.datasource.dbcp.PooledDatasourceHelper.getJndiDataSource(PooledDatasourceHelper.java:378)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.BaseDatasourceService.getJndiDataSource(BaseDatasourceService.java:99)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.NonPooledOrJndiDatasourceService.retrieve(NonPooledOrJndiDatasourceService.java:67)
... 108 more
Caused by: javax.naming.NameNotFoundException: El nombre SampleData no este asociado a este contexto
at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:152)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.PooledDatasourceHelper.getJndiDataSource(PooledDatasourceHelper.java:339)
... 110 more
mondrian.olap.MondrianException: Mondrian Error:Internal error: Error while looking up data source (SampleData)
at mondrian.resource.MondrianResource$_Def0.ex(MondrianResource.java:977)
at mondrian.olap.Util.newInternal(Util.java:2404)
at mondrian.rolap.RolapConnection.createDataSource(RolapConnection.java:431)
at mondrian.rolap.RolapConnection.<init>(RolapConnection.java:135)
at mondrian.rolap.RolapConnection.<init>(RolapConnection.java:91)
at mondrian.olap.DriverManager.getConnection(DriverManager.java:113)
at mondrian.olap.DriverManager.getConnection(DriverManager.java:69)
at mondrian.olap4j.MondrianOlap4jConnection.<init>(MondrianOlap4jConnection.java:157)
at mondrian.olap4j.FactoryJdbc4Plus$AbstractConnection.<init>(FactoryJdbc4Plus.java:323)
at mondrian.olap4j.FactoryJdbc41Impl$MondrianOlap4jConnectionJdbc41.<init>(FactoryJdbc41Impl.java:118)
at mondrian.olap4j.FactoryJdbc41Impl.newConnection(FactoryJdbc41Impl.java:32)
at mondrian.olap4j.MondrianOlap4jDriver.connect(MondrianOlap4jDriver.java:134)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at com.olaphelper.provider.HelperConnection.connect(HelperConnection.java:101)
at com.olaphelper.provider.HelperConnection.isConnected(HelperConnection.java:55)
at com.olaphelper.api.rest.OlapResources.getCubeDimensions(OlapResources.java:98)
at com.olaphelper.api.rest.OlapResources$$FastClassByCGLIB$$767f2eeb.invoke(<generated>)
. . .
Caused by: org.pentaho.platform.api.data.DBDatasourceServiceException: DatasourceService.ERROR_0003 - Unable to get jndi datasource
at org.pentaho.platform.engine.services.connection.datasource.dbcp.NonPooledOrJndiDatasourceService.retrieve(NonPooledOrJndiDatasourceService.java:69)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.BaseDatasourceService.getDataSource(BaseDatasourceService.java:69)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.DynamicallyPooledOrJndiDatasourceService.resolveDatabaseConnection(DynamicallyPooledOrJndiDatasourceService.java:37)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.NonPooledOrJndiDatasourceService.retrieve(NonPooledOrJndiDatasourceService.java:51)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.BaseDatasourceService.getDataSource(BaseDatasourceService.java:69)
at org.pentaho.platform.web.servlet.PentahoDataSourceResolver.lookup(PentahoDataSourceResolver.java:43)
at mondrian.rolap.RolapConnection.createDataSource(RolapConnection.java:429)
... 102 more
Caused by: org.pentaho.platform.api.data.DBDatasourceServiceException: javax.naming.NameNotFoundException: El nombre SampleData no este asociado a este contexto
at org.pentaho.platform.engine.services.connection.datasource.dbcp.PooledDatasourceHelper.getJndiDataSource(PooledDatasourceHelper.java:378)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.BaseDatasourceService.getJndiDataSource(BaseDatasourceService.java:99)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.NonPooledOrJndiDatasourceService.retrieve(NonPooledOrJndiDatasourceService.java:67)
... 108 more
Caused by: javax.naming.NameNotFoundException: El nombre SampleData no este asociado a este contexto
at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:152)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at org.pentaho.platform.engine.services.connection.datasource.dbcp.PooledDatasourceHelper.getJndiDataSource(PooledDatasourceHelper.java:339)
... 110 more
Оба плагина являются одним и тем же pentaho и имеют одинаковые свойства mondrian, поэтому я не понимаю, почему это происходит.
2 ответа
Недавно я просмотрел свой старый код и удалил некоторые строки, которые мне не нужны, в plugin.spring.xml, и мой плагин работает без ошибок.
Линии, которые породили проблему, следующие
<context:property-placeholder location="config/jdbc.properties"/>
<!-- import rest="lib/hibernate.cfg.xml"/ -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:maxActive="${dbcp.maxActive}"
p:maxIdle="${dbcp.maxIdle}"
p:maxWait="${dbcp.maxWait}"
/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configurationClass="org.hibernate.cfg.AnnotationConfiguration"
p:packagesToScan="com.stratebi.stx.console.model">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${schema.generation}</prop>
<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
<prop key="hibernate.connection.url">${jdbc.url}</prop>
<prop key="hibernate.connection.driver_class">${jdbc.driverClassName}</prop>
<prop key="hibernate.connection.username">${jdbc.username}</prop>
<prop key="hibernate.connection.password">${jdbc.password}</prop>
</props>
</property>
<!--property name="annotatedPackages" value="com.stratebi.stx.console" />
<property name="configLocation" value="config/hibernate.cfg.xml" / -->
<property name="eventListeners">
<map>
<entry key="merge">
<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
</entry>
</map>
</property>
<property name="annotatedClasses">
<list>
</list>
</property>
</bean>
<tx:annotation-driven transaction-manager="txnManager"/>
<!-- Hibernate transaction manager -->
<bean id="txnManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory"/>
но реальная проблема, которую я думал, вызвана менеджером транзакций или гибернацией, которая вызвала конфликт с собственными библиотеками Пентахо, мне нужно рассмотреть это позже, но пока ошибка исчезает.
Вы создаете свой собственный экземпляр Mondrian внутри "частного" пространства загрузчика классов. Кажется, что он не разрешает соединение JNDI правильно.
Попробуйте что-нибудь попроще и посмотрите на IOlapService на платформе Pentaho.