вызов хранимой процедуры из Solr - PullRequest
10 голосов
/ 11 января 2012

Я пишу приложение, которое ищет по solr 3.4. Для заполнения индекса solr я использую dataimporthandler и класс com.microsoft.sqlserver.jdbc.SQLServerDriver, чтобы получить данные из базы данных MS SQL.

Сейчас я пытаюсь вызвать хранимую процедуру в базе данных, но журнал solr всегда возвращает ошибки:

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

Я пробовал разные версии для вызова хранимой процедуры. Вот вопросы:

<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>

Кто-нибудь знает, как вызвать хранимую процедуру из solr? Или кто-нибудь знает, где мне искать причину?

Большое спасибо за все ваши ответы!

Ответы [ 2 ]

15 голосов
/ 09 марта 2012

Для меня это работает так:

<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>

Но это работает, только если хранимая процедура содержит простой запрос SELECT.

Если я объявлю некоторые переменные или временные таблицы перед запросом, который будет возвращать результаты, то импорт завершится неудачей, предоставив мне то же исключение, что и вы.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ

Мне удалось заставить его работать с более сложными запросами в хранимой процедуре. добавляя SET NOCOUNT ON; в начале хранимой процедуры.

1 голос
/ 06 сентября 2013

Вам нужно вызвать хранимую процедуру, используя следующий синтаксис

<entity  name="PicturePath" processor="CachedSqlEntityProcessor" query="[h_getThumbnails] '4'"
">      </entity>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...