<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sql &#8211; Solr.pl</title>
	<atom:link href="https://solr.pl/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>https://solr.pl</link>
	<description>All things to be found - Blog related to Apache Solr &#38; Lucene projects - https://solr.apache.org</description>
	<lastBuildDate>Tue, 10 Nov 2020 22:32:11 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>Data Import Handler – import danych z baz SQL (cz. 3)</title>
		<link>https://solr.pl/2010/11/22/data-import-handler-import-danych-z-baz-sql-cz-3/</link>
					<comments>https://solr.pl/2010/11/22/data-import-handler-import-danych-z-baz-sql-cz-3/#respond</comments>
		
		<dc:creator><![CDATA[Marek Rogoziński]]></dc:creator>
		<pubDate>Mon, 22 Nov 2010 22:30:30 +0000</pubDate>
				<category><![CDATA[Solr]]></category>
		<category><![CDATA[sql]]></category>
		<guid isPermaLink="false">http://sematext.solr.pl/?p=142</guid>

					<description><![CDATA[W poprzednich odcinkach (cz. 1 i cz. 2) udało nam się zaimportować dane z bazy danych zarówno w sposób pełny, jak i przyrostowy. Dziś czas na małe podsumowanie. Ustawienia dataSource Przypomnijmy linię z naszej konfiguracji: &#60;dataSource driver="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/wikipedia" user="wikipedia" password="secret"]]></description>
										<content:encoded><![CDATA[<p>W poprzednich odcinkach (<a title="Data Import Handler - import danych z baz SQL (cz. 1)" href="http://solr.pl/2010/10/11/data-import-handler-%E2%80%93-import-danych-z-baz-sql-cz-1/">cz. 1</a> i <a title="Data Import Handler - import danych z baz SQL (cz. 2)" href="http://solr.pl/2010/11/01/data-import-handler-%E2%80%93-import-danych-z-baz-sql-cz-2/">cz. 2</a>) udało nam się zaimportować dane z bazy danych zarówno w sposób pełny, jak i przyrostowy. Dziś czas na małe podsumowanie.</p>
<p><span id="more-142"></span></p>
<h2>Ustawienia dataSource</h2>
<p>Przypomnijmy linię z naszej konfiguracji:
</p>
<pre class="brush:xml">&lt;dataSource
    driver="org.postgresql.Driver"
    url="jdbc:postgresql://localhost:5432/wikipedia"
    user="wikipedia"
    password="secret" /&gt;</pre>
<p>To nie wszystkie atrybuty, które mogą się tutaj pojawić. Dla czytelności wypiszmy je wszystkie:</p>
<ul>
<li><strong>name</strong> – nazwa źródła – możemy zdefiniować wiele 	źródeł i odwoływać się do nich przez atrybut „dataSource” 	taga „entity”</li>
<li><strong>driver</strong> – nazwa klasy sterownika jdbc</li>
<li><strong>url</strong> – url jdbc do bazy danych</li>
<li><strong>user</strong> – nazwa użytkownika bazy danych (jeśli nie 	zdefiniowany, lub pusty, połączenie do bazy następuje bez podania 	pary user/password)</li>
<li><strong>password</strong> – hasło użytkownika</li>
<li><strong>jndiName</strong> – zamiast podania elementów: 	driver/url/user/password można podać nazwę JNDI pod którą 	dostępna jest implementacja źródła danych (javax.sql.DataSource) 	u<span style="color: #000000;"><span style="font-family: Liberation Serif,serif;"><span style="font-size: x-small;">dostępniana przez kontener (np. Jetty/Tomcat)</span></span></span></li>
</ul>
<p>Argumenty zaawansowane:</p>
<ul>
<li><strong>batchSize</strong> (domyślnie: 500) – ustawia maksymalną liczbę 	(a raczej sugestię dla sterownika) rekordów pobieranych z bazy 	danych w jednym odwołaniu do bazy. Zmiana tego parametru może 	pomóc w sytuacji, gdy zapytania zwracają duże wyniki. Może też 	nie pomóc, gdyż implementacja tego mechanizmu zależy od 	sterownika JDBC.</li>
<li><strong>convertType</strong>(domyślnie: false) – Wykonuje dodatkową 	konwersję z typu pola zwracanego przez bazę danych na typ pola 	zdefiniowanego w schema.xml. Domyślna wartość wydaje się być 	bezpieczniejsza, gdyż nie powoduje dodatkowych, magicznych 	konwersji. Jednak w szczególnych przypadkach (np. Pola typu BLOB) 	taka konwersja jest jednym ze sposobów rozwiązania problemu</li>
<li><strong>maxRows</strong> (domyślnie: 0 – brak limitu) – ustawia 	maksymalną liczbę wyników zwracanych przez zapytania do bazy</li>
<li><strong>readOnly</strong> – ustawia połączenie do bazy w tryb odczytu. W 	zasadzie może to oznaczać, że sterownik będzie mógł wykonać 	dodatkowe optymalizacje. Jednocześnie oznacza to domyślne(!)  	ustawienie transactionIsolation na  	<em>TRANSACTION_READ_UNCOMMITTED</em>, holdability 	na <em>CLOSE_CURSORS_AT_COMMIT</em>, autoCommit na 	<em>true</em></li>
<li><strong>autoCommit</strong> – ustawia automatyczne zatwierdzanie transakcji 	po każdym zapytaniu</li>
<li><strong>transactionIsolation</strong> (<em>TRANSACTION_READ_UNCOMMITTED</em>, <em> TRANSACTION_READ_COMMITTED</em>, <em>TRANSACTION_REPEATABLE_READ</em>, 	<em>TRANSACTION_SERIALIZABLE</em>,<em>TRANSACTION_NONE</em>) – ustawia izolacje transakcji (czyli widoczność danych zmienionych w 	obrębie transakcji)</li>
<li><strong>holdability</strong> (<em>CLOSE_CURSORS_AT_COMMIT</em>, 	<em>HOLD_CURSORS_OVER_COMMIT</em>)- 	definiuje sposób zamykania obiektów wyników (ResultSet) w 	sytuacji, gdy zamykana jest transakcja</li>
<li><strong>&#8230;</strong> &#8211; istotne jest to, że mogą wystąpić dowolne inne 	atrybuty. Wszystkie  DIH przekazuje do drivera JDBC, co pozwala na 	definiowane specjalnych zachowań określonych przez konkretny 	driver JDBC.</li>
<li><strong>type</strong> – typ źródła. Domyślna wartość (<em>JdbcDataSource</em>) 	jest wystarczająca, więc o tym tagu można zapomnieć (przypomnimy 	o nim sobie przy okazji definiowania nie-SQLowych źródeł)</li>
</ul>
<h2>Element „entity”</h2>
<p>Przejdźmy teraz do opisu elementu „entity”.</p>
<p>Dla przypomnienia:
</p>
<pre class="brush:xml">&lt;entity name="page" query="SELECT page_id as id, page_title as name from page"&gt;
    &lt;entity name="revision" query="select rev_id from revision where rev_page=${page.id}"&gt;
        &lt;entity name="pagecontent" query="select old_text as text from pagecontent where old_id=${revision.rev_id}"&gt;
        &lt;/entity&gt;
    &lt;/entity&gt;
&lt;/entity&gt;</pre>
<p>I wszystkie atrybuty:</p>
<p>Podstawowe:</p>
<ul>
<li><strong>name</strong> – nazwa encji</li>
<li><strong>query</strong> – zapytanie SQL służące do pobierania danych 	związanych z danym entity.</li>
<li><strong>deltaQuery &#8211; </strong>zapytanie 	odpowiedzialne za zwrócenie <strong>identyfikatorów</strong> tych rekordów, które 	zmieniły się od ostatniego indeksowania (pełnego  lub 	przyrostowego) – czas ostatniego indeksowania DIH dostarcza w 	 zmiennej:${dataimporter.last_index_time}. 	To zapytanie jest używane  przez SOLR do znajdowania tych rekordów, 	które się zmieniły.</li>
<li><strong>parentDeltaQuery &#8211; </strong>zapytanie 	zwracające dane dla rekordu encji-rodzica. Dzięki 	tym  zapytaniom SOLR jest w stanie pobrać wszystkie dane składające 	się na  dokument, niezależnie od tego, z której encji pochodzą. 	Konieczne jest  to dlatego, 	że silnik indeksowania 	nie ma możliwości modyfikacji  zindeksowanych danych – musimy 	więc zindeksować cały dokument, 	 niezależnie od tego, że część danych się nie zmieniła.</li>
<li><strong>deletedPkQuery &#8211; </strong>dostarcza 	identyfikatorów usuniętych elementów.</li>
<li><strong>deltaImportQuery &#8211; </strong>zapytanie zwracające 	dane dla rekordu o identyfikatorze podanym jako zmienna DIH: 	${dataimport.delta.id}.</li>
<li><strong>dataSource</strong> – nazwa źródła, wykorzystywana w przypadku 	definicji kilku źródeł (patrz: dataSource.name)</li>
</ul>
<p>i zaawansowane:</p>
<ul>
<li><strong>processor &#8211; </strong>domyślnie<strong> </strong><em>SQLEntityProcessor. </em>Element,  którego zadaniem jest dostarczenie ze źródła danych kolejnych elementów  do indeksowania. W przypadku baz danych zwykle domyślna implementacja  jest wystarczająca</li>
<li><strong>transformer </strong>&#8211; dane pobrane ze źródła mogą być dodatkowo modyfikowane przed przekazaniem do indeksowania. W szczególności transformer może zwracać dodatkowe rekordy, co powoduje, że jest to bardzo potężne narzędzie</li>
<li><strong>rootEntity</strong> -domyślnie <em>true</em> dlaelementu <em>entity</em> znajdującego się poniżej elementu <em>document</em>. Oznacza ten element, który jest traktowany, jako głowny, tzn on posłuży do tworzenia nowych elementów w indeksie</li>
<li><strong>threads </strong>&#8211; liczba wątków używanych przy obsłudze elementu <em>entity</em></li>
<li><strong>onError</strong> (<em>abort</em>, <em>skip</em>, <em>continue</em>) – sposób reakcji na błędy: 	przerwanie działania (<em>abort</em>, domyślne zachowanie), zignorowanie 	dokumentu (<em>skip</em>), zignorowanie błędu (<em>continue</em>)</li>
<li><strong>preImportDeleteQuery</strong> &#8211; używany zamiast &#8222;*:* do skasowania danych z indeksu. (Uwaga: zapytanie do indeksu, nie zapytanie bazodanowe) &#8211; ma sens tylko w głównym elemencie <em>entity</em></li>
<li><strong>postImportDeleteQuery</strong> &#8211; używane po pełnym imporcie. (podobnie jak <em>preImportDeleteQuery</em> zapytanie do indeksu) &#8211; ma sens tylko w głównym elemencie <em>entity</em></li>
<li><strong>pk </strong>&#8211; klucz główny (bazodanowy, nie mylić z unikalnym kluczem dokumentu) &#8211; ma znaczenie tylko w indeksowaniu przyrostowym, jeśli pozwalamy DIH zgadnąć <em>deltaImportQuery</em> na podstawie <em>query</em></li>
</ul>
<p>Powyżej pojawiło się słowo &#8222;zgadnąć&#8221;. DIH stara się usprawniać pracę, poprzez przyjmowanie sensownych wartości domyślnych. Na przykład, tak jak wspomniano powyżej, w trakcie importowania przyrostowego jest w stanie sam spróbować określić <em>deltaImportQuery</em>. Tak na prawdę było to jedyne zachowanie we wcześniejszych wersjach, zdano sobie jednak sprawę z tego, że tak wygenerowane zapytanie nie zawsze zadziała. Stąd sugeruje się jednak ostrożność i zasadę ograniczonego zaufania <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Innym drobiazgiem jest możliwość pominięcia definicji pól: <em>field</em> w sytuacji, gdy nazwy kolumn zwracanych przez zapytanie odpowiadają nazwom pól w <em>schema.xml</em>.&nbsp; (Ręka w górę: kto zauważył, że przypomniany powyżej przykład wykorzystania <em>entity</em> nie jest kopią z części drugiej, tylko korzysta z tego mechanizmu?)</p>
<p>Jeszcze innym przykładem na to, że DIH jest bardzo elastyczny jest zwrócenie uwagi na fakt, że mając konstrukcję typu:
</p>
<pre>${dataimporter.last_index_time}</pre>
<p>jesteśmy w stanie napisać tak definicję pełnego importu, że w sytuacji, gdy był już przeprowadzany import, będzie się ona zachowała jak import przyrostowy! Chyba ta funkcjonalność &#8222;wyszła&#8221; trochę przez przypadek <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://solr.pl/2010/11/22/data-import-handler-import-danych-z-baz-sql-cz-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
