2012-01-11 17 views
8

Estoy escribiendo una aplicación que busca por solr 3.4. Para llenar el índice de solr, utilizo el manejador de datos y la clase com.microsoft.sqlserver.jdbc.SQLServerDriver para obtener los datos de la base de datos MS SQL.llamando al procedimiento almacenado desde solr

Ahora estoy tratando de llamar a un procedimiento almacenado en la base de datos de registro, pero Solr siempre devolver errores:

Full Import failed:org.apache.solr.handler.dataimport.DataImportHandlerException: Unable to execute query: exec dbo.h_getThumbnails @h = '52'  Processing Document # 48 
    at org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow(DataImportHandlerException.java:72) 
    at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:253) 
    at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:210) 
    at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:39) 
    at org.apache.solr.handler.dataimport.SqlEntityProcessor.initQuery(SqlEntityProcessor.java:59) 
    at org.apache.solr.handler.dataimport.CachedSqlEntityProcessor.getAllNonCachedRows(CachedSqlEntityProcessor.java:69) 
    at org.apache.solr.handler.dataimport.EntityProcessorBase.getSimpleCacheData(EntityProcessorBase.java:259) 
    at org.apache.solr.handler.dataimport.CachedSqlEntityProcessor.nextRow(CachedSqlEntityProcessor.java:58) 
    at org.apache.solr.handler.dataimport.EntityProcessorWrapper.nextRow(EntityProcessorWrapper.java:238) 
    at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:596) 
    at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:622) 
    at org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:268) 
    at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:187) 
    at org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:359) 
    at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:427) 
    at org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:408) 
Caused by: java.lang.NullPointerException 
    at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:251) 
    ... 14 more 

La he probado diferentes versiones para llamar al procedimiento almacenado. Aquí las consultas:

<entity name="PicturePath" processor="CachedSqlEntityProcessor" query="exec dbo.h_getThumbnails @h = 4 
">  </entity> 

<entity name="PicturePath" processor="CachedSqlEntityProcessor" query="call dbo.h_getThumbnails @h = 4 
">  </entity> 
<entity name="PicturePath" processor="CachedSqlEntityProcessor" query=" dbo.h_getThumbnails @h = 4 
">  </entity> 

¿Alguien sabe cómo llamar a un procedimiento almacenado de Solr? ¿O alguien sabe dónde debo buscar la causa?

¡Muchas gracias por todas sus respuestas!

+0

Parece que el apoyo a los procedimientos/declaraciones exigibles de importación de datos Handler (DIH) se encuentran pendientes de Solr - https://issues.apache.org/jira/browse/SOLR-1262 –

Respuesta

13

Para mí funciona así:

<dataSource name="ds-1" type="JdbcDataSource" driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://10.0.2.47;databaseName=dbname" user="username" password="password" 
    responseBuffering="adaptive" batchSize="0" autoCommit="false" /> 
<entity name="item" dataSource="ds-1" query="[sp_StuffDataImportHandler]"></entity> 

Pero esto sólo funciona si el procedimiento almacenado contiene una consulta SELECT simple.

Si declaro algunas variables o tablas temporales antes de la consulta que devolverá los resultados, la importación falla, dándome la misma excepción que obtienes.

de editar posteriormente

logré hacer que funcione con las consultas más complejas en el procedimiento almacenado. agregando SET NOCOUNT ON; al comienzo del procedimiento almacenado.

+0

¿cómo pasa el parámetro aquí? – Krunal

+3

como lo hace normalmente cuando llama a un procedimiento almacenado. query = "[sp_StuffDataImportHandler] 'parameter1' 'parameter2'" – Dorin

+0

oh eso es fácil y genial ... gracias Dorin – Krunal

0

es necesario llamar a procedimiento almacenado utilizando la sintaxis siguiente

<entity name="PicturePath" processor="CachedSqlEntityProcessor" query="[h_getThumbnails] '4'" 
">  </entity> 
Cuestiones relacionadas