2014-01-08 21 views
0

我想從我的Windows 7 Enterrpise工作站(美國)使用Solr 4.6從遠程計算機(亞洲)上的SQL Server 2008表訪問760萬條記錄。 0.我試圖按照docs使用clean = false做一個完全導入。我正在爲SQL Server使用JTDS驅動程序。 我收到以下錯誤後4個小時:使用Solr DataImportHandler檢索大量表的連接重置異常 - SQL Server

Caused by: java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(Unknown Source) 
..... at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:850) 

我假設SQL服務器連接斷開,那麼多的時間後,套接字連接。 它適用於當我嘗試從Solr管理界面開始= 0,行= 100000,即只有100K記錄。 Solr中使用DataImportHandler

我的數據庫定義文件:

<dataSource name="dbDS" 
type="JdbcDataSource" 
driver="net.sourceforge.jtds.jdbc.Driver" url="jdbc:jtds:sqlserver://xxx.corp.com/xxx;instance=xxx;useCursors=true;useLOBs=false;socketKeepAlive=true;socketTimeout=432000;" 
user="xx" password="xxx" /> 

<entity name="log" 
    dataSource="dbDS" 
    query="select * from XXX" 
    transformer="TemplateTransformer, DateFormatTransformer" 
    deltaImportQuery="select * from log where LOGID ='${dataimporter.delta.id}'" 
    deltaQuery="select LOGID from log where TIME_STAMP &gt; '${dataimporter.last_index_time}'" 
    preImportDeleteQuery="type:log" 
    > ..... 

我怎樣才能獲得使用全進口的所有7.6萬條記錄?

請問dataSource中的batchSize屬性是否適用於jdbc連接?

我正在重新發明輪子,編寫我自己的代碼,從 中獲取數據庫中的數據,並將最後導入的時間戳存儲在屬性文件中通過Solr的delta導入並添加到Solr,同時將schema.xml中的所有分析器修改應用到結果集。我正在考慮捕獲此異常並重試從DB中拉出的一批數據。是否有更簡單的方法可以執行這個 ? 我也看了這個:solr, solrj: I/O exception (java.net.SocketException) caught when processing request: Connection reset

我確實有一個conf/dataimport.properties。正如其他一些職位所述。

TIA,

維傑

回答

0

維傑,我覺得這是不是一個 「Solr的」 問題本身。這看起來像是通過很長的網絡連接長時間使用基於套接字的連接的挑戰。根據我的經驗,使用JDBC打開套接字的時間越長,通過非常長的網絡連接,就越難得到!這就是爲什麼我們最終使用簡單的方法,例如消息傳遞或請求/響應來橋接長距離,而不是像套接字和JDBC這樣的非常快速但更脆弱的方法。

我的DIH經驗法則是當它工作時,它很棒。但是當它開始受到阻礙時,由於諸如你所擁有的問題,那麼你最好是自己動手。

如果你想繼續使用DIH,你可以先將數據傳輸到本地數據庫,然後攝取?我敢打賭,你會看到這項工作好得多。我還想知道在這麼長的一段時間內攝取700萬條記錄可能需要多長時間,特別是如果它們是大量豐富的日誌消息。