<?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>Журнал системного программиста &#187; eclipse</title>
	<atom:link href="http://sadko.xskernel.org/archives/tag/eclipse/feed" rel="self" type="application/rss+xml" />
	<link>http://sadko.xskernel.org</link>
	<description>блог обо всём и ни о чём</description>
	<lastBuildDate>Wed, 14 Dec 2011 20:21:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>openSUSE 11.2 Migration tips #3</title>
		<link>http://sadko.xskernel.org/archives/1666</link>
		<comments>http://sadko.xskernel.org/archives/1666#comments</comments>
		<pubDate>Sun, 13 Dec 2009 19:53:49 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Одминское]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[suse]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1666</guid>
		<description><![CDATA[Tweet Собственно, ещё один неприятный момент, возникший в связи с миграцией на openSUSE 11.2. Заключается этот момент в том, что в моей любимой Eclipse IDE кнопки ненормально реагируют на щелчки мышью. Вернее, так: некоторые кнопки, когда я пытаюсь кликать на них, просто не работают. Как выяснилось из бага 555807, связано это с новой версией GTK. [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1666',
  title: 'openSUSE 11.2 Migration tips #3',
  description: 'Собственно, ещё один неприятный момент, возникший в связи с миграцией на openSUSE 11.2.\n\nЗаключается этот момент в том, что в моей любимой Eclipse IDE кнопки ненормально реагируют на щелчки мышью. Вернее...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1666"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="openSUSE 11.2 Migration tips #3" data-url="http://sadko.xskernel.org/archives/1666">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Собственно, ещё один неприятный момент, возникший в связи с миграцией на openSUSE 11.2.</p>
<p>Заключается этот момент в том, что в моей любимой <b>Eclipse IDE</b> кнопки ненормально реагируют на щелчки мышью. Вернее, так: некоторые кнопки, когда я пытаюсь кликать на них, просто не работают. Как выяснилось из бага <a href="https://bugzilla.novell.com/show_bug.cgi?id=555807">555807</a>, связано это с новой версией GTK. В новой <b>Eclipse</b> это дело, вроде, уже исправили.<br />
Для тех же, кто пока не хочет менять версию, есть костыль (читать workaround): для нормальной работы Eclipse и других java-приложений, использующих GTK, нужно установить переменную среды окружения <b>GDK_NATIVE_WINDOWS</b> в <b>true</b>:</p>

<div class="wp_codebox"><table><tr id="p16663"><td class="code" id="p1666code3"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">GDK_NATIVE_WINDOWS</span>=<span style="color: #c20cb9; font-weight: bold;">true</span></pre></td></tr></table></div>

<p>Например, эту строчку можно записать в <b>.bashrc</b>:</p>

<div class="wp_codebox"><table><tr id="p16664"><td class="code" id="p1666code4"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;export GDK_NATIVE_WINDOWS=true&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span>~<span style="color: #000000; font-weight: bold;">/</span>.bashrc</pre></td></tr></table></div>

<p>Перелогиниваемся, запускаем <b>Eclipse</b>, радуемся.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1666/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sequoia изнутри #1</title>
		<link>http://sadko.xskernel.org/archives/1365</link>
		<comments>http://sadko.xskernel.org/archives/1365#comments</comments>
		<pubDate>Thu, 27 Aug 2009 11:01:10 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Одминское]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[apache2 license]]></category>
		<category><![CDATA[cjdbc]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[lgpl]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sequoia]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1365</guid>
		<description><![CDATA[Tweet Как бэ вступление По работе возникла необходимость синхронной рабты с кластером БД (4 базы, в которых должны храниться одни и те же данные). Для этого я несколько месяцев подряд писать тулзу data_proc (коммерческая разработка), которая обрабатывает данные в поточном режиме и устойчива к connection-loss/database-failure ошибкам. Единственный недостаток &#8212; это хранение данных на локальном диске [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1365',
  title: 'Sequoia изнутри #1',
  description: 'Как бэ вступление\nПо работе возникла необходимость синхронной рабты с кластером БД (4 базы, в которых должны храниться одни и те же данные). Для этого я несколько месяцев подряд писать тулзу dat...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1365"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Sequoia &ETH;&cedil;&ETH;&middot;&ETH;&frac12;&Ntilde;&Ntilde;&Ntilde;&ETH;&cedil; #1" data-url="http://sadko.xskernel.org/archives/1365">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><h3>Как бэ вступление</h3>
<p>По работе возникла необходимость синхронной рабты с кластером БД (4 базы, в которых должны храниться одни и те же данные). Для этого я несколько месяцев подряд писать тулзу <strong>data_proc</strong> (коммерческая разработка), которая обрабатывает данные в поточном режиме и устойчива к connection-loss/database-failure ошибкам. Единственный недостаток &#8212; это хранение данных на локальном диске в виде журналов, объём которых достаточно велик, если база несколько часов находится offline.<br />
Помимо <strong>data_proc</strong> у нас есть ещё куча других приложений, для которых пришлось писать балансировщик нагрузки для SELECT-запросов, с чем мы успешно справились. Тем не менее, вопрос балансировки нагрузки и кластеризации (с целью упрощения <strong>data_proc</strong>) остался, и мне предложили разобраться с C-JDBC, о чём я и буду сейчас писать.<br />
<span id="more-1365"></span></p>
<h3>C-JDBC или Sequoia</h3>
<p>Собственно, было предложено покопаться в проекте <a href="http://c-jdbc.ow2.org/">C-JDBC (Clustered JDBC)</a>, который имеет лицензию LGPL. Выкачал дистрибутив, сорсы и доки для Linux, поставил в /opt. Стал разбираться, как скрестить это чудо с <a href="http://www.oracle.com/">ORACLE</a>. Честно прочитал <a href="http://c-jdbc.ow2.org/doc/index.html">бОльшую часть документации на этот продукт</a>, и после некоторых бдений с когфигами и осознавания того, что я делаю не так, выяснил, что ан-нет, не получается никак. Это чудо генерило исключения при попытке получить схему БД ORACLE. Да, я бы всё понял, если бы это не было <strong>java.lang.NullPointerException</strong>. После долгих скитаний в <a>Google</a> я, было, совсем отчаялся.<br />
&#171;А, может, я не ту версию скачал?&#187; &#8212; подумал я, и пошёл снова на официальный сайт C-JDBC, на котором заметил, что C-JDBC имеет своё продолжение &#8212; проект <a href="http://www.continuent.com/community/lab-projects/sequoia">Sequoia</a>, с изменённой лицензией на Apache License. Скачав последнюю версию, стал ковырять&#8230;</p>
<h3>Первые грабли</h3>
<p>Первыми граблями оказалось портирование конфига с C-JDBC на Sequoia. Очень жестокий XML-валидатор ругался и матерился, пока я всё-таки не выяснил, что ему действительно было нужно от меня. Разобравшись с валидатором, я всё-таки написал конфиг, объединяющий две схемы двух разных БД в кластер по технологии <a href="http://c-jdbc.ow2.org/current/doc/userGuide/html/ar01s10.html#raidb1">RAIDb-1</a>. Контроллер вроде бы запустился, да даже вроде бы поднял так называемые backends (проще говоря, законнектился к базам).<br />
Отлично, теперь можно слабать простенькую табличку:<br />
<code>CREATE TABLE TM_FIRST<br />
(<br />
nID NUMBER,<br />
strMessage VARCHAR2(256),<br />
nCode NUMBER<br />
)<br />
</code><br />
Что я незамедлительно и проделал на обеих схемах.<br />
Пришло время написать какой-нить код, который что-то делает с этим кластером. Что ж, берём в руки <a href="http://www.eclipse.org/">Eclipse</a>, создаём проект и заводим вот такой классик:</p>
<pre>
<FONT COLOR=RED><B>package</B></FONT> test<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>cjdbc<FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

<FONT COLOR=RED><B>import</B></FONT> java<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>sql<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT><FONT COLOR=BLUE SIZE=+1>*</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

<FONT COLOR=RED><B>import</B></FONT> org<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>continuent<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>sequoia<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>driver<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>DataSource<FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

<FONT COLOR=GREEN><I>/** CJDBC controller test
 * @author Vladimir Sadovnikov
 *
 */</I></FONT>

<FONT COLOR=RED><B>public</B></FONT> <FONT COLOR=RED><B>class</B></FONT> Tm_CJDBCTest
<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
	<FONT COLOR=GREEN><I>/**
	 * @param args
	 */</I></FONT>
	<FONT COLOR=RED><B>public</B></FONT> <FONT COLOR=RED><B>static</B></FONT> <FONT COLOR=RED><B>void</B></FONT> main<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>String<FONT COLOR=BLUE SIZE=+1><B>[</B></FONT><FONT COLOR=BLUE SIZE=+1><B>]</B></FONT> args<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>

	<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
		DataSource ds <FONT COLOR=BLUE SIZE=+1>=</FONT> <FONT COLOR=RED><B>new</B></FONT> DataSource<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

		ds<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setURL<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"jdbc:sequoia://localhost:25322/CJDBC"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

		ds<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setUser<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"user"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
		ds<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setPassword<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"userpass"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

		<FONT COLOR=RED><B>try</B></FONT>
		<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
			Connection conn <FONT COLOR=BLUE SIZE=+1>=</FONT> ds<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>getConnection<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

			conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setAutoCommit<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>false<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

			<FONT COLOR=RED><B>try</B></FONT>
			<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
				PreparedStatement stm <FONT COLOR=BLUE SIZE=+1>=</FONT> conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>prepareStatement<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"INSERT INTO Tm_First (nID, strMessage, nCode) VALUES (?, ?, ?)"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=RED><B>try</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setInt<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>1</FONT><FONT COLOR=BLUE SIZE=+1><B>,</B></FONT> <FONT COLOR=BROWN>666</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setString<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>2</FONT><FONT COLOR=BLUE SIZE=+1><B>,</B></FONT> <FONT COLOR=PURPLE>"Hello, World!"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setInt<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>3</FONT><FONT COLOR=BLUE SIZE=+1><B>,</B></FONT> <FONT COLOR=BROWN>13</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>addBatch<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>execute<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
					conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>commit<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
				<FONT COLOR=RED><B>catch</B></FONT> <FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>SQLException ex<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>rollback<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					<FONT COLOR=RED><B>throw</B></FONT> ex<FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
				<FONT COLOR=RED><B>finally</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>close<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>

				stm <FONT COLOR=BLUE SIZE=+1>=</FONT> conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>prepareStatement<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"SELECT * from Tm_First"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=RED><B>try</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					ResultSet rset <FONT COLOR=BLUE SIZE=+1>=</FONT> stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>executeQuery<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					<FONT COLOR=RED><B>try</B></FONT>

					<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
						<FONT COLOR=RED><B>while</B></FONT> <FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>next<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>
						<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>

							String result <FONT COLOR=BLUE SIZE=+1>=</FONT> <FONT COLOR=PURPLE>"fetched item: "</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
							result <FONT COLOR=BLUE SIZE=+1>+</FONT><FONT COLOR=BLUE SIZE=+1>=</FONT> rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>getInt<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>1</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT> <FONT COLOR=BLUE SIZE=+1>+</FONT> <FONT COLOR=PURPLE>";"</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

							result <FONT COLOR=BLUE SIZE=+1>+</FONT><FONT COLOR=BLUE SIZE=+1>=</FONT> rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>getString<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>2</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT> <FONT COLOR=BLUE SIZE=+1>+</FONT> <FONT COLOR=PURPLE>";"</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

							result <FONT COLOR=BLUE SIZE=+1>+</FONT><FONT COLOR=BLUE SIZE=+1>=</FONT> rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>getInt<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>3</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT> <FONT COLOR=BLUE SIZE=+1>+</FONT> <FONT COLOR=PURPLE>"\n"</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

							System<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>out<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>println<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>result<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
						<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
					<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>

					<FONT COLOR=RED><B>finally</B></FONT>
					<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
						rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>close<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
					<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
				<FONT COLOR=RED><B>catch</B></FONT> <FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>SQLException ex<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>rollback<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					<FONT COLOR=RED><B>throw</B></FONT> ex<FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
				<FONT COLOR=RED><B>finally</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>close<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
			<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
			<FONT COLOR=RED><B>finally</B></FONT>
			<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
				conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>close<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

			<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
		<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
		<FONT COLOR=RED><B>catch</B></FONT> <FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>SQLException ex<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>
		<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
			ex<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>printStackTrace<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

		<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
	<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT></pre>
<p>Запускаем класс на выполнение, в базы вставляется по строчке, контроллер рапортует об успехе, выдав мне на SELECT-запрос строчку. Ура-ура-ура: в базах данные вроде бы синхронны. Что ж, пора брать в руки молоток.</p>
<h3>Краш-тест</h3>
<p>Что ж, посмотрим, как контроллер отреагирует на отказ в работе одной из БД.<br />
Для этого, не мудрствуя лукаво, я делаю следующий трюк:<br />
<code>ALTER USER cjdbc ACCOUNT LOCK</code><br />
То есть, блокирую аккаунт, через который контроллер Sequoia подключается к базе. После чего вывожу список коннекций:<br />
<code>select s.sid s.serial#, s.osuser, s.username, s.program FROM v$session s where USERNAME like 'CJDBC' and OSUSER IS NULL</code><br />
И поочереди сношу их через<br />
<code>ALTER SYSTEM KILL SESSION  IMMEDIATE;</code><br />
После этого база контроллеру недоступна, и я с чистой совестью снова прогоняю тест. В результате чего в одной базе две записи, в другой &#8212; одна. И никаких дополнительных метаданных, по которым можно было бы восстановить зеркальность баз, нет ни в первой, ни во второй.<br />
Что ж, может это очень умная штука, которая использует какие-то ораклёвые фичи, о которых я не знаю? OK, тогда разрешаем аккаунт:<br />
<code>ALTER USER cjdbc ACCOUNT UNLOCK</code><br />
И снова прогоняем тест. В первой базе три записи, во второй &#8212; по-прежнему одна, а SELECT бодро выдаёт три записи через ResultSet.<br />
Может быть, оно после рестарта как-то восстановится? Ладно, вырубаю контроллер (жёстко, по ctrl-c). Запускаю снова. Sequoia подключается к обеим базам, вытаскивает схемы и&#8230; больше ничего не делает.<br />
Ладно, прогоняю ещё раз тест&#8230; В первой базе четыре записи, во второй &#8212; всего две, и выдёргивается через SELECT только две.</p>
<h3>Но не может же быть!</h3>
<p>subj, ведь в официальной документации от Sequoia говорится следующее:<br />
<quote><br />
You have a Java application or a Java-based application server that accesses one or several databases. The database tier becomes the bottleneck of your application or it is a single point of failure or both. Sequoia can help you resolve these problems by providing:<br />
    * performance scalability by adding database nodes and balancing the load among these nodes.<br />
    * high availability of the database tier, i.e. Sequoia tolerates database crashes and offers transparent failover using database replication techniques.<br />
    * improved performance with fine grain query caching and transparent connection pooling.<br />
    * SQL traffic logging for performance monitoring and analysis.<br />
    * support for clusters of heterogeneous database engines.<br />
</quote><br />
Вспоминаю, что в доках упоминалась такая фигня, как <a href="http://c-jdbc.ow2.org/current/doc/userGuide/html/ar01s11.html#dtd_recoverylog">RecoveryLog</a>. Может, причина в том, что я не сконфигурировал его? Да, похоже, надо конфигурить, но это тема для отдельного поста.</p>
<h3>Заключение</h3>
<p>Первое знакомство с C-JDBC оказалось неудачным, в Sequoia был пофиксен ряд багов, что, тем не менее, не мешало ей валить исключения при определённых настройках. Тестирование работы RAIDb-1 оказалось полностью провальным (до первого сбоя), опция RecoveryLog не использовалась. Похоже, что в документации нас хотят обмануть. Но исследование продолжается.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1365/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 программ, с которыми я работаю ежедневно</title>
		<link>http://sadko.xskernel.org/archives/993</link>
		<comments>http://sadko.xskernel.org/archives/993#comments</comments>
		<pubDate>Fri, 25 Jul 2008 21:21:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Свободное ПО]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[kde]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mc]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[opensuse]]></category>
		<category><![CDATA[suse]]></category>
		<category><![CDATA[thunderbird]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/993</guid>
		<description><![CDATA[Tweet Очень долго пытался написать ответ моему знакомому Андрею Валяеву (он же Dron) на эту запись: http://mdf-i.blogspot.com/2008/06/5.html Но всё как-то откладывал. Исправляюсь. Итак, 5 программ, которые я использую ежедневно (или почти ежедневно): KDE. Это удобная среда для работы и учёбы. С кучей полезного софта. Рассматривать каждую софтину поотдельности даже и не хочется. Пока будет удобно, [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/993',
  title: '5 программ, с которыми я работаю ежедневно',
  description: 'Очень долго пытался написать ответ моему знакомому Андрею Валяеву (он же Dron) на эту запись: http://mdf-i.blogspot.com/2008/06/5.html Но всё как-то откладывал. Исправляюсь.Итак, 5 программ, которые я использую еже...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/993"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="5 &ETH;&iquest;&Ntilde;&ETH;&frac34;&ETH;&sup3;&Ntilde;&ETH;&deg;&ETH;&frac14;&ETH;&frac14;, &Ntilde; &ETH;&ordm;&ETH;&frac34;&Ntilde;&ETH;&frac34;&Ntilde;&Ntilde;&ETH;&frac14;&ETH;&cedil; &Ntilde; &Ntilde;&ETH;&deg;&ETH;&plusmn;&ETH;&frac34;&Ntilde;&ETH;&deg;&Ntilde; &ETH;&micro;&ETH;&para;&ETH;&micro;&ETH;&acute;&ETH;&frac12;&ETH;&micro;&ETH;&sup2;&ETH;&frac12;&ETH;&frac34;" data-url="http://sadko.xskernel.org/archives/993">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Очень долго пытался написать ответ моему знакомому Андрею Валяеву (он же Dron) на эту запись:</p>
<p> <a href="http://mdf-i.blogspot.com/2008/06/5.html">http://mdf-i.blogspot.com/2008/06/5.html</a> </p>
<p>Но всё как-то откладывал. Исправляюсь.</p>
<p>Итак, 5 программ, которые я использую ежедневно (или почти ежедневно):</p>
<p><b>KDE.</b> Это удобная среда для работы и учёбы. С кучей полезного софта. Рассматривать каждую софтину поотдельности даже и не хочется. Пока будет удобно, буду ей пользоваться.</p>
<p><b>Shell.</b> Что может порой быть удобнее командной строки? Да ничего! Узнать список процессов, используемые ресурсы ПК и пр. можно буквально вводом нескольких команд в BASH.</p>
<p><b>Eclipse.</b> Это удобная IDE, написанная на Java. Да, она ресурсоёмкая (в плане памяти). Но куча интересных плагинов вроде CDT, Subclipse, EPIC и др. позволяют расширять её возможности, интегрировать возможность работы с другими языками и различными системами контроля версий.</p>
<p><b>Mozilla.</b> Сюда входят Firefox и Thunderbird. Первая &#8212; для веба, вторая &#8212; для почты и RSS. Удобство в том, что они есть и под Linux, и под Windows, и под *BSD, и под MacOS. И не надо ни на что другое переучиваться. Кроссплатформенность рулит.</p>
<p><b>Midnight Commander.</b> На мой взгляд, самый удобный консольный файл-менеджер. Порой без него бывает тяжеловато рыться в каталогах. Поэтому выношу его в мой TOP-5.</p>
<p>Всё, Дрон, отстрелялся <img src='http://sadko.xskernel.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Принимай.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/993/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

