<?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>Dragisa Krsmanovic</title>
	<atom:link href="http://www.dragishak.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.dragishak.com</link>
	<description>Blog</description>
	<lastBuildDate>Wed, 11 Apr 2012 20:40:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
	<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=dragisak&amp;popout=1&amp;url=http%3A%2F%2Fwww.dragishak.com%2F&amp;language=en_US&amp;category=text&amp;title=Dragisa+Krsmanovic&amp;description=Blog&amp;tags=blog" type="text/html" />
		<item>
		<title>Setting MySQL Load Balancing in Play and Scala</title>
		<link>http://www.dragishak.com/?p=353</link>
		<comments>http://www.dragishak.com/?p=353#comments</comments>
		<pubDate>Wed, 11 Apr 2012 20:34:29 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[playframework]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=353</guid>
		<description><![CDATA[In my previous post I showed a way to set MySQL load balancing with Java and Spring. To make your queries go to the slave database, you need to set connection to read-only. In Play Framework 2.0 with Scala, this can&#8217;t be simpler: Now you can just wrap your database code as: For additional info [...]]]></description>
				<content:encoded><![CDATA[<p>In my <a title="MySQL Master/Slave Load Balancing with JPA and Spring" href="http://www.dragishak.com/?p=307">previous post</a> I showed a way to set MySQL load balancing with Java and Spring.</p>
<p>To make your queries go to the slave database, you need to set connection to read-only. In <a title="Play Framework" href="http://www.playframework.org/">Play Framework 2.0</a> with <a title="Scala" href="http://www.scala-lang.org/">Scala</a>, this can&#8217;t be simpler:</p>
<pre class="brush: scala; title: ; notranslate">
def withReadOnlyConnection[A](block: Connection =&gt; A)(implicit app: Application): A = {
    DB.withConnection {
      connection =&gt;
        try {
          connection.setAutoCommit(false)
          connection.setReadOnly(true)
          block(connection)
        } finally {
          connection.setReadOnly(false)
        }
    }
}
</pre>
<p>Now you can just wrap your database code as:</p>
<pre class="brush: scala; title: ; notranslate">
withReadOnlyConnection[Option[User]] {
   implicit connection: Connection =&gt;

      SQL(....)
      etc, etc.
}
</pre>
<p>For additional info on Play and Anorm see: <a title="Anorm, simple SQL data access" href="http://www.playframework.org/documentation/2.0/ScalaAnorm">Anorm, simple SQL data access</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=353</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL Master/Slave Load Balancing with JPA and Spring</title>
		<link>http://www.dragishak.com/?p=307</link>
		<comments>http://www.dragishak.com/?p=307#comments</comments>
		<pubDate>Mon, 13 Jun 2011 20:25:00 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[load balancing]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=307</guid>
		<description><![CDATA[MySQL Connector/J driver has built-in feature for load balancing. If you have a cluster of read/write MySQL servers. Putting loadbalance: in the JDBC URL will ensure both read and write operations are distributed across servers. jdbc:mysql:loadbalance://master1,master2,master3&#8230;/database?loadBalanceBlacklistTimeout=5000&#38;loadBalanceConnectionGroup=cgroup&#38;loadBalanceEnableJMX=true&#38;autoReconnect=true&#38;autoReconnectForPools=true What we needed is all write operations to go to master server and read-only operations to be equally distributed [...]]]></description>
				<content:encoded><![CDATA[<p>MySQL <a href="http://www.mysql.com/downloads/connector/j/">Connector/J</a> driver has built-in feature for load balancing.</p>
<p>If you have a cluster of read/write MySQL servers. Putting <code><b>loadbalance:</b></code> in the JDBC URL will ensure both read and write operations are distributed across servers.</p>
<div class="geshi no txt">
<ol>
<li class="li1">
<div class="de1">jdbc:mysql:loadbalance://master1,master2,master3&#8230;/database?loadBalanceBlacklistTimeout=5000&amp;loadBalanceConnectionGroup=cgroup&amp;loadBalanceEnableJMX=true&amp;autoReconnect=true&amp;autoReconnectForPools=true</div>
</li>
</ol>
</div>
<p>What we needed is all write operations to go to master server and read-only operations to be equally distributed among multiple read-only slaves.</p>
<p>For that you need to:</p>
<ol>
<li>Use special JDBC driver: <code><b>com.mysql.jdbc.ReplicationDriver</b></code></li>
<li>Set <code><b>replication:</b></code> in the URL:<br />
<br/></p>
<div class="geshi no txt">
<ol>
<li class="li1">
<div class="de1">jdbc:mysql:replication://master,slave1,slave2&#8230;/database?loadBalanceBlacklistTimeout=5000&amp;loadBalanceConnectionGroup=ugc&amp;loadBalanceEnableJMX=true&amp;autoReconnect=true&amp;autoReconnectForPools=true</div>
</li>
</ol>
</div>
</li>
</ol>
<p>After setting our connection pool like this, all load still ended up going to our single read/write master server.</p>
<p>The reason is that, for the ReplicationDriver to know that queries can go to read-only slaves, two conditions need to be met: </p>
<ol>
<li>Auto commit needs to be turned off. (*)</sup></li>
<li>Connection needs to be set to read-only.</li>
</ol>
<p>
<sup>(*)</sup><i>There is a workaround to allow auto commit: <a href="http://mysqlblog.fivefarmers.com/2010/08/03/connectorj-load-balancing-for-auto-commit-enabled-deployments/">Connector/J load-balancing for auto-commit-enabled deployments</a><br />
</i></p>
<p>Turns out, even if transaction is set to read-only, neither Spring nor JPA providers like Hibernate or EclipseLink will set JDBC connection to readOnly.</p>
<p>To ensure JDBC Connection is set to read-only, I created an annotation and a simple AOP interceptor.</p>
<p>Here is an example code:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">@Aspect</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> ReadOnlyConnectionInterceptor <span class="kw2">implements</span> Ordered <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> <span class="kw4">int</span> order<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> EntityManager entityManager<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> setOrder<span class="br0">&#40;</span><span class="kw4">int</span> order<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">order</span> = order<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; @Override</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">int</span> getOrder<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> order<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; @PersistenceContext</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> setEntityManager<span class="br0">&#40;</span>EntityManager entityManager<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>.<span class="me1">entityManager</span> = entityManager<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; @Around<span class="br0">&#40;</span><span class="st0">&quot;@annotation(readOnlyConnection)&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw3">Object</span> proceed<span class="br0">&#40;</span>ProceedingJoinPoint pjp, ReadOnlyConnection readOnlyConnection<span class="br0">&#41;</span> <span class="kw2">throws</span> <span class="kw3">Throwable</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Connection</span> connection = entityManager.<span class="me1">unwrap</span><span class="br0">&#40;</span>java.<span class="me1">sql</span>.<span class="kw3">Connection</span>.<span class="kw2">class</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">boolean</span> autoCommit = connection.<span class="me1">getAutoCommit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">boolean</span> readOnly = connection.<span class="me1">isReadOnly</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connection.<span class="me1">setAutoCommit</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connection.<span class="me1">setReadOnly</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> pjp.<span class="me1">proceed</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw2">finally</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// restore state</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connection.<span class="me1">setReadOnly</span><span class="br0">&#40;</span>readOnly<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connection.<span class="me1">setAutoCommit</span><span class="br0">&#40;</span>autoCommit<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>One important thing is to set priority of this interceptor to be lower than the Spring&#8217;s transaction interceptor. That way we want to make sure transaction is created before we start modifying the connection. In other words,  you would set order for @Transactional to be less than order for your new interceptor:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;tx:annotation-driven</span> <span class="re0">order</span>=<span class="st0">&quot;10&quot;</span><span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;bean</span> <span class="re0">id</span>=<span class="st0">&quot;readOnlyInterceptor&quot;</span> <span class="re0">class</span>=<span class="st0">&quot;com.myproject.ReadOnlyConnectionInterceptor&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;order&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;20&quot;</span><span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/bean<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>Now, if you want queries to execute on your pool of slave databases, you can just set an annotation on the service method:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">@Transactional<span class="br0">&#40;</span>readOnly=<span class="kw2">true</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">@ReadOnlyConnection</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> Result serviceMethod<span class="br0">&#40;</span>&#8230;<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;&#8230;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>References:</p>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.6/en/connector-j-reference-configuration-properties.html">Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J</a></li>
<li><a href="http://mysqlblog.fivefarmers.com/tag/connector-j/">Todd Farmer&#8217;s blog about Connector/J</a></li>
<li><a href="http://gabrito.com/post/load-balancing-across-mysql-servers-using-jdbc">Load balancing across MySQL servers using JDBC by Todd Huss</a></li>
<li><a href="http://static.springsource.org/spring/docs/current/reference/aop.html">Aspect Oriented Programming with Spring</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=307</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>String class broken in latest JDK</title>
		<link>http://www.dragishak.com/?p=282</link>
		<comments>http://www.dragishak.com/?p=282#comments</comments>
		<pubDate>Thu, 30 Sep 2010 18:32:25 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[String]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=282</guid>
		<description><![CDATA[Java bug 6935535: public class Test &#123; &#160; public static void main&#40;String args&#91;&#93;&#41; &#123; &#160; &#160; &#160; String str = &#34;1111111111111xx1111111111111xx1x&#34;; &#160; &#160; str = str.substring&#40;0, 31&#41;; &#160; &#160; String query = &#34;1111111111111xx1x&#34;; &#160; &#160; int idx = str.indexOf&#40;query&#41;; &#160; &#160; System.out.println&#40;&#34;IndexOf(&#34; + query + &#34;) = &#34; + idx + &#34; in &#34; + [...]]]></description>
				<content:encoded><![CDATA[<p>Java bug <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6935535">6935535</a>:</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> Test <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><span class="kw3">String</span> args<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">String</span> str = <span class="st0">&quot;1111111111111xx1111111111111xx1x&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; str = str.<span class="me1">substring</span><span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">31</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">String</span> query = <span class="st0">&quot;1111111111111xx1x&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> idx = str.<span class="me1">indexOf</span><span class="br0">&#40;</span>query<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;IndexOf(&quot;</span> + query + <span class="st0">&quot;) = &quot;</span> + idx + <span class="st0">&quot; in &quot;</span> + str<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<pre>
javac Test.java

# Java interpreter
java Test
IndexOf(1111111111111xx1x) = -1 in 1111111111111xx1111111111111xx1

# BUG !! When HotSpot compiler is on
java -Xcompile Test
IndexOf(1111111111111xx1x) = 15 in 1111111111111xx1111111111111xx1
</pre>
<p>Seen on both Sun JDK 1.6.0_20 and OpenJDK 1.6.0_18</p>
<p><strong>Update: This bug is fixed in Sun JDK 1.6.0_22</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=282</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Merging EOL and Freebase</title>
		<link>http://www.dragishak.com/?p=274</link>
		<comments>http://www.dragishak.com/?p=274#comments</comments>
		<pubDate>Thu, 26 Aug 2010 00:41:33 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[eol]]></category>
		<category><![CDATA[freebase]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=274</guid>
		<description><![CDATA[I wrote a simple Acre application that allows users to easily add EOL keys to Freebase organism classification. Encyclopedia of Life is an ambitious project to create &#8220;.. electronic page for each species of organism on Earth..&#8221; and Freebase is a open structured data repository recently purchased by Google. Go to app: http://eolfetch.freebaseapps.com/ (you need [...]]]></description>
				<content:encoded><![CDATA[<p>I wrote a simple <a href="http://code.google.com/p/acre/">Acre</a> application that allows users to easily add EOL keys to Freebase <a href="http://www.freebase.com/view/biology/organism_classification">organism classification</a>.</p>
<p><a href="http://www.eol.org">Encyclopedia of Life</a> is an ambitious project to create <em>&#8220;.. electronic page for each species of organism on Earth..&#8221;</em> and <a href="http://www.freebase.com">Freebase</a> is a open structured data repository recently <a href="http://googleblog.blogspot.com/2010/07/deeper-understanding-with-metaweb.html">purchased</a> by Google.</p>
<p>Go to app: <a href="http://eolfetch.freebaseapps.com/" target="_blank">http://eolfetch.freebaseapps.com/</a> (you need to have Freebase account)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=274</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ActiveMQ flow control and Apache Camel transacted route gotchas</title>
		<link>http://www.dragishak.com/?p=254</link>
		<comments>http://www.dragishak.com/?p=254#comments</comments>
		<pubDate>Sat, 10 Jul 2010 04:02:33 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[camel]]></category>
		<category><![CDATA[flowcontrol]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[transactions]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=254</guid>
		<description><![CDATA[We have a system that uses Apache Camel and ActiveMQ. It handles periodic bursts of 20,000 messages. The end consumer is slow and it takes about an hour to process all the messages. On their route, messages are passed from one queue to another. On our production system we stumbled onto an unexpected problem. After [...]]]></description>
				<content:encoded><![CDATA[<p>We have a system that uses <a title="Apache Camel" href="http://camel.apache.org/" target="_blank">Apache Camel</a> and <a title="Apache ActiveMQ" href="http://activemq.apache.org/" target="_blank">ActiveMQ</a>. It handles periodic bursts of 20,000 messages. The end consumer is slow and it takes about an hour to process all the messages. On their route, messages are passed from one queue to another. On our production system we stumbled onto an unexpected problem. After finishing few thousand messages the whole system would freeze.</p>
<p>The problem was with ActiveMQ flow control and transacted routes in Camel.</p>
<p>When you have slow consumers, to prevent queues from growing infinitely, ActiveMQ has a limit of how many messages you can put in a queue. When limit is reached, producer is, by default, forced to wait until the resources free. You can set these limits on system level or per queue level. Problem arises when you have transacted Camel route and system limit is reached.</p>
<p><img style="border: none; background: none; padding: 0;" src="/pix/AMQFlowControl.png" alt="AMQ Flow Control" /></p>
<p>Route that moves messages from queue <em><strong>A</strong></em> to queue <em><strong>B</strong></em> is inside a JMS transaction &#8211; you can&#8217;t remove message from queue <em><strong>A</strong></em> until the message is successfully placed on queue <em><strong>B</strong></em>.</p>
<p>If system limit is reached, no new messages can be sent to any queue. So, producers are forced to wait, transaction doesn&#8217;t complete, messages can&#8217;t be taken off queue <em><strong>A</strong></em> and no resource gets freed. The  whole processing freezes.</p>
<p>There are numerous ways you can work around this problem. You can turn off flow control and potentially let queues grow indefinitely.</p>
<p>In our case, solution was to set per-queue limits so that system limits can never be reached. Sum of limits for all queues needs to be less than the system limit. That way, as consumer takes messages from queue <em><strong>B</strong></em>, new messages can come in, transactions can complete and messages can be taken off queue <em><strong>A</strong></em>. Messages are consumed from queues <em><strong>A</strong></em> and <em><strong>B</strong></em> at the same pace and the whole system works fine.</p>
<p>In our case, I&#8217;ve set <code>memoryLimit</code> to 10m for our 13 queues and system <code>memoryUsage</code> to 180m.</p>
<p>For details see :</p>
<ul>
<li><a title="Producer Flow Control" href="http://activemq.apache.org/producer-flow-control.html" target="_blank">ActiveMQ Producer Flow Control</a></li>
<li><a title="Slow Consumer Handling" href="http://activemq.apache.org/slow-consumer-handling.html" target="_blank">ActiveMQ Slow Consumer Handling</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=254</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Solr DisMax parser and stop words</title>
		<link>http://www.dragishak.com/?p=125</link>
		<comments>http://www.dragishak.com/?p=125#comments</comments>
		<pubDate>Wed, 26 May 2010 06:49:39 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[dismax]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[lucene]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[solr]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=125</guid>
		<description><![CDATA[If you want to use DisMax parser in Solr you need to be careful how to index the fields that DisMax will be using. If you mix fields that filter out stop words (plain text) and fields that do not filter out stop words (like author names), your simple queries might end up with no [...]]]></description>
				<content:encoded><![CDATA[<p>If you want to use <a title="DisMax" href="http://wiki.apache.org/solr/DisMaxRequestHandler" target="_blank">DisMax</a> parser in <a title="Lucene Solr" href="http://lucene.apache.org/solr/" target="_blank">Solr</a> you need to be careful how to index the fields that DisMax will be using.</p>
<p>If you mix fields that filter out stop words (plain text) and fields that do not filter out stop words (like author names), your simple queries might end up with no results. </p>
<p>By default, DisMax will display only results that contain all the words from your query string. If your query has stop words like &#8220;ants of madagascar&#8221;, stop word &#8220;of&#8221; might not be found in any of the fields &#8211; it&#8217;s not in author names and it&#8217;s filtered out in article body &#8211; and you will get zero results.</p>
<p>Possible workarounds:</p>
<ul>
<li>Relax Minimum Match (<b>mm</b>) requirement.<br />
<i>Downside</i>: Lowering mm will increase number of results. mm of 50% on &#8220;ants madagascar&#8221; will return all documents that have &#8220;ants&#8221; and all docs that have &#8220;madagascar&#8221; in them.</li>
<li>Do not filter out stop words.<br />
<i>Downside</i>: Your index can get large and you might get large number of less relevant results.</li>
<li>Use other indexing schemes like N-Grams.</li>
</ul>
<p><a href="http://www.lucidimagination.com/blog/2010/05/23/whats-a-dismax/">This article</a> explains the details.</p>
<p>Also see <a href="http://old.nabble.com/Re%3A-DisMax-request-handler-doesn%27t-work-with-stopwords--p11016770.html" target="_blank">this</a> and <a href="http://lucene.472066.n3.nabble.com/Dismax-Minimum-Match-Stopwords-Bug-td493483.html" target="_blank">this</a> discussion.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=125</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XSLT Unicode Horror</title>
		<link>http://www.dragishak.com/?p=131</link>
		<comments>http://www.dragishak.com/?p=131#comments</comments>
		<pubDate>Wed, 19 May 2010 05:50:36 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdk]]></category>
		<category><![CDATA[saxon]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[utf-8]]></category>
		<category><![CDATA[xalan]]></category>
		<category><![CDATA[xerces]]></category>
		<category><![CDATA[xsl]]></category>
		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=131</guid>
		<description><![CDATA[Different Java XSLT implementation have different handling of UTF-8 characters. Here is test code that parses UTF-8 XML into DOM document and then serializes it using a transformer. System.out.println&#40;&#34; &#160; &#160;SOURCE: &#160;&#34; + source&#41;; DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance&#40;parserClass, TestUnicode.class.getClassLoader&#40;&#41;&#41;; Document document = builderFactory.newDocumentBuilder&#40;&#41;.parse&#40;new InputSource&#40;new StringReader&#40;source&#41;&#41;&#41;; TransformerFactory transformerFactory = TransformerFactory.newInstance&#40;transformerClass, TestUnicode.class.getClassLoader&#40;&#41;&#41;; StringWriter writer = new StringWriter&#40;&#41;; [...]]]></description>
				<content:encoded><![CDATA[<p>Different Java XSLT implementation have different handling of UTF-8 characters. Here is test code that parses UTF-8 XML into DOM document and then serializes it using a transformer.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot; &nbsp; &nbsp;SOURCE: &nbsp;&quot;</span> + source<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">DocumentBuilderFactory builderFactory = DocumentBuilderFactory.<span class="me1">newInstance</span><span class="br0">&#40;</span>parserClass, TestUnicode.<span class="kw2">class</span>.<span class="me1">getClassLoader</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">Document</span> document = builderFactory.<span class="me1">newDocumentBuilder</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">parse</span><span class="br0">&#40;</span><span class="kw2">new</span> InputSource<span class="br0">&#40;</span><span class="kw2">new</span> <span class="kw3">StringReader</span><span class="br0">&#40;</span>source<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">TransformerFactory transformerFactory = TransformerFactory.<span class="me1">newInstance</span><span class="br0">&#40;</span>transformerClass, TestUnicode.<span class="kw2">class</span>.<span class="me1">getClassLoader</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">StringWriter</span> writer = <span class="kw2">new</span> <span class="kw3">StringWriter</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">transformerFactory.<span class="me1">newTransformer</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">transform</span><span class="br0">&#40;</span><span class="kw2">new</span> DOMSource<span class="br0">&#40;</span>document<span class="br0">&#41;</span>, <span class="kw2">new</span> StreamResult<span class="br0">&#40;</span>writer<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot; &nbsp; &nbsp;RESULT: &nbsp;&quot;</span> + writer.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>I tested following transformers:</p>
<ul style="list-style: none;">
<li>
<a href="http://xml.apache.org/xalan-j/">Xalan</a> 2.7.1:</p>
<ul style="list-style: none;">
<li style="font-size:90%;">org.apache.xalan.processor.TransformerFactoryImpl</li>
<li style="font-size:90%;">org.apache.xalan.xsltc.trax.TransformerFactoryImpl</li>
<li style="font-size:90%;">org.apache.xalan.xsltc.trax.SmartTransformerFactoryImpl</li>
</ul>
</li>
<li>
<a href="http://java.sun.com/webservices/docs/1.4/jaxp/ReleaseNotes.html#manual">Sun-Xalan</a> (an internal transformer factory present in Sun JDK 5 and 6):</p>
<ul style="list-style: none;">
<li style="font-size:90%;">com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl</li>
</ul>
</li>
<li>
<a href="http://saxon.sourceforge.net/">Saxon</a> 8.7:</p>
<ul style="list-style: none;">
<li style="font-size:90%;">net.sf.saxon.TransformerFactoryImpl</li>
</ul>
</li>
</ul>
<p>Here are the results for <a href="http://www.fileformat.info/info/unicode/char/1d49f/index.htm">Mathematical Script Capital D</a> character: <span style="font-size:200%;">𝒟</span></p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">TRANSFORMER: org.apache.xalan.processor.TransformerFactoryImpl</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span>𝒟<span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#55349;</span><span class="sc1">&amp;#56479;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#119967;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#55349;</span><span class="sc1">&amp;#56479;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">TRANSFORMER: org.apache.xalan.xsltc.trax.TransformerFactoryImpl</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span>𝒟<span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#55349;</span><span class="sc1">&amp;#56479;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#119967;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#55349;</span><span class="sc1">&amp;#56479;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">TRANSFORMER: org.apache.xalan.xsltc.trax.SmartTransformerFactoryImpl</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span>𝒟<span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#55349;</span><span class="sc1">&amp;#56479;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#119967;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#55349;</span><span class="sc1">&amp;#56479;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">TRANSFORMER: com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span>𝒟<span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re0">standalone</span>=<span class="st0">&quot;no&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#119967;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#119967;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re0">standalone</span>=<span class="st0">&quot;no&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#119967;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">TRANSFORMER: net.sf.saxon.TransformerFactoryImpl</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span>𝒟<span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span>𝒟<span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; SOURCE: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#119967;</span><span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; RESULT: &nbsp;<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><span class="sc3"><span class="re1">&lt;foo<span class="re2">&gt;</span></span></span>𝒟<span class="sc3"><span class="re1">&lt;/foo<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>Or, summarized in a table:</p>
<table style="border: 1px solid black;border-collapse:collapse;">
<tbody>
<tr>
<th style="border: 1px solid black;">&nbsp;</th>
<th style="border: 1px solid black; padding: 4px;text-align:center;">𝒟</th>
<th style="border: 1px solid black; padding: 4px;text-align:center;">&amp;#119967;</th>
</tr>
<tr>
<td style="border: 1px solid black; padding: 0 4px 0 4px; font-weight:bold;">Xalan 2.7.1</td>
<td style="border: 1px solid black; padding: 4px 6px 4px 6px; text-align:center;">&amp;#55349;&amp;#56479;</td>
<td style="border: 1px solid black; padding: 4px 6px 4px 6px; text-align:center;">&amp;#55349;&amp;#56479;</td>
</tr>
<tr>
<td style="border: 1px solid black; padding: 0 4px 0 4px;  font-weight:bold;">Sun-Xalan (Sun JDK 1.5+)</td>
<td style="border: 1px solid black; padding: 4px 6px 4px 6px; text-align:center;">&amp;#119967;</td>
<td style="border: 1px solid black; padding: 4px 6px 4px 6px; text-align:center;">&amp;#119967;</td>
</tr>
<tr>
<td style="border: 1px solid black; padding: 0 4px 0 4px; font-weight:bold;">Saxon 8.7</td>
<td style="border: 1px solid black; padding: 4px 6px 4px 6px; text-align:center;">𝒟</td>
<td style="border: 1px solid black; padding: 4px 6px 4px 6px; text-align:center;">𝒟</td>
</tr>
</tbody>
</table>
<p>The results were the same regardless of the parser implementation. <a href="http://xerces.apache.org/xerces2-j/">Xerces</a> or <a href="http://saxon.sourceforge.net/">Saxon</a>.</p>
<p><a href="http://xml.apache.org/xalan-j/">Xalan&#8217;s</a> handling of UTF-8 multi-byte characters seems to be seriously flawed. <code>&amp;#55349;&amp;#56479;</code> are not valid UTF-8 characters and both <a href="http://xerces.apache.org/xerces2-j/">Xerces</a> and <a href="http://saxon.sourceforge.net/">Saxon</a> parsers will throw SAXParseException when trying to parse documents that have them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=131</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nasty bug with generics and introspection</title>
		<link>http://www.dragishak.com/?p=108</link>
		<comments>http://www.dragishak.com/?p=108#comments</comments>
		<pubDate>Tue, 20 Apr 2010 00:15:34 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[generics]]></category>
		<category><![CDATA[introspection]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=108</guid>
		<description><![CDATA[public class Test { &#160; &#160; public static interface Foo &#123; &#160; &#160; public T getX&#40;&#41;; &#160; &#125; &#160; &#160; public static class Bar implements Foo &#123; &#160; &#160; public String getX&#40;&#41; &#123; &#160; &#160; &#160; return &#34;Hello World&#34;; &#160; &#160; &#125; &#160; &#125; &#160; &#160; public static void main&#40;String&#91;&#93; args&#41; &#123; &#160; &#160; Method&#91;&#93; [...]]]></description>
				<content:encoded><![CDATA[<div class="geshi no java">
<div class="head">public class Test {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw2">interface</span> Foo <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> T getX<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw2">class</span> Bar <span class="kw2">implements</span> Foo <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw3">String</span> getX<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="st0">&quot;Hello World&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">Method</span><span class="br0">&#91;</span><span class="br0">&#93;</span> methods = Bar.<span class="kw2">class</span>.<span class="me1">getDeclaredMethods</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw3">Method</span> method : methods<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>method.<span class="me1">getReturnType</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+<span class="st0">&quot; &quot;</span>+method.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Will return :</p>
<div class="geshi no text">
<div class="head">class java.lang.String getX</div>
<ol>
<li class="li1">
<div class="de1">class java.lang.Object getX</div>
</li>
</ol>
</div>
<p>A) It&#8217;s illegal in Java to have two methods with the same signature returning different types.</p>
<p>B) The order in which these methods are returned would be completely random. For example, this can cause <a href="http://commons.apache.org/beanutils/commons-beanutils-1.7.0/docs/api/org/apache/commons/beanutils/BeanUtils.html#copyProperties%28java.lang.Object,%20java.lang.Object%29" target="_blank">BeanUtils.copyProperties(..)</a> to intermittently fail to copy some bean properties. BeanUtils would take the first get method returned, find that the return type is not matching corresponding set method and skip it.</p>
<p>The bug is present in both Java 5 and 6. There are several bugs filed around this problem. For example: <a href="http://bugs.sun.com/view_bug.do?bug_id=6422403">6422403</a> and <a href="http://bugs.sun.com/view_bug.do?bug_id=6528714">6528714</a>. The bad news is that this is not going to be fixed until Java 7.</p>
<p><strong>Update:</strong><br />
<em>This is not a bug but a feature. One of the methods returned by introspection is synthetic. Unfortuntely, code written for Java prior to 1.5 like Commons BeanUtils do not recognize this and will break in described situation.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=108</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RDFa on PLoS</title>
		<link>http://www.dragishak.com/?p=78</link>
		<comments>http://www.dragishak.com/?p=78#comments</comments>
		<pubDate>Sat, 24 Oct 2009 16:10:08 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[plos]]></category>
		<category><![CDATA[rdfa]]></category>
		<category><![CDATA[semanticweb]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=78</guid>
		<description><![CDATA[After the last release, all PLoS articles are tagged with RDFa. For example, go to this article. To view triples from the page use Firefox Operator plugin or GetN3. You should see following Dublin Core triples. &#60;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&#62; &#60;http://purl.org/dc/terms/language&#62; &#34;en&#34; . &#60;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&#62; &#60;http://purl.org/dc/terms/publisher&#62; &#34;Public Library of Science&#34; . &#60;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&#62; &#60;http://purl.org/dc/terms/type&#62; &#60;http://purl.org/dc/dcmitype/Text&#62; . &#60;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&#62; &#60;http://purl.org/dc/terms/title&#62; &#34;Anesthetics Rapidly [...]]]></description>
				<content:encoded><![CDATA[<p>After the last release, all <a href="http://www.plos.org/">PLoS</a> articles are tagged with <a href="http://en.wikipedia.org/wiki/RDFa">RDFa</a>.</p>
<p>For example, go to <a href="http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043">this article</a>. To view triples from the page use Firefox <a href="https://addons.mozilla.org/en-US/firefox/addon/4106">Operator</a> plugin or <a href="http://www.w3.org/2006/07/SWD/RDFa/impl/js/">GetN3</a>. You should see following <a href="http://dublincore.org/">Dublin Core</a> triples.</p>
<div class="geshi no txt">
<ol>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/language&gt; &quot;en&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/publisher&gt; &quot;Public Library of Science&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/type&gt; &lt;http://purl.org/dc/dcmitype/Text&gt; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/title&gt; &quot;Anesthetics Rapidly Promote Synaptogenesis during a Critical Period of Brain Development&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/description&gt; &quot;
</div>
</li>
<li class="li1">
<div class="de1">Experience-driven activity plays an essential role in the development of brain circuitry during critical periods of early postnatal life, a process that depends upon a dynamic balance between excitatory and inhibitory signals. Since general anesthetics are powerful pharmacological modulators of neuronal activity, an important question is whether and how these drugs can affect the development of synaptic networks. To address this issue, we examined here the impact of anesthetics on synapse growth and dynamics. We show that exposure of young rodents to anesthetics that either enhance GABAergic inhibition or block NMDA receptors rapidly induce a significant increase in dendritic spine density in the somatosensory cortex and hippocampus. This effect is developmentally regulated; it is transient but lasts for several days and is also reproduced by selective antagonists of excitatory receptors. Analyses of spine dynamics in hippocampal slice cultures reveals that this effect is mediated through an increased rate of protrusions formation, a better stabilization of newly formed spines, and leads to the formation of functional synapses. Altogether, these findings point to anesthesia as an important modulator of spine dynamics in the developing brain and suggest the existence of a homeostatic process regulating spine formation as a function of neural activity. Importantly, they also raise concern about the potential impact of these drugs on human practice, when applied during critical periods of development in infants.
</div>
</li>
<li class="li1">
<div class="de1">&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/identifier&gt; &lt;http://dx.doi.org/10.1371/journal.pone.0007043&gt; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/date&gt; &quot;2009-09-16&quot;^^&lt;http://www.w3.org/2001/XMLSchema-datatypes#date&gt; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/subject&gt; &quot;Anesthetic Mechanisms&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/subject&gt; &quot;Anesthesiology and Pain Management&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/subject&gt; &quot;Developmental Biology&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/subject&gt; &quot;Neurodevelopment&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/subject&gt; &quot;Neuroscience&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/creator&gt; &quot;Mathias De Roo&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/creator&gt; &quot;Paul Klauser&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/creator&gt; &quot;Adrian Briner&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/creator&gt; &quot;Irina Nikonenko&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/creator&gt; &quot;Pablo Mendez&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/creator&gt; &quot;Alexandre Dayer&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/creator&gt; &quot;Jozsef Z. Kiss&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/creator&gt; &quot;Dominique Muller&quot; .
</div>
</li>
<li class="li1">
<div class="de1">&lt;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0007043&gt; &lt;http://purl.org/dc/terms/creator&gt; &quot;Laszlo Vutskits&quot; .</div>
</li>
</ol>
</div>
<p>Currently supported <a href="http://dublincore.org/documents/dcmi-terms/">DC terms</a> are <i>identifier, title, description, type, language, creator, subject, publisher</i></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=78</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Hoy Kid</title>
		<link>http://www.dragishak.com/?p=72</link>
		<comments>http://www.dragishak.com/?p=72#comments</comments>
		<pubDate>Sun, 18 Oct 2009 02:43:06 +0000</pubDate>
		<dc:creator>Dragisa Krsmanovic</dc:creator>
				<category><![CDATA[Mission]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.dragishak.com/?p=72</guid>
		<description><![CDATA[Laurie wrote another article for Mission Local, San Francisco Mission neighborhood blog/news site. Hoy Kids is turning into a regular column. And my baby boy is on the front page ! Read the article&#62;]]></description>
				<content:encoded><![CDATA[<p>Laurie wrote <a href="http://missionlocal.org/2009/10/hoy-kid10-1/" target="_blank">another article</a> for <a title="Mission Local" href="http://missionlocal.org" target="_blank">Mission Local</a>, San Francisco Mission neighborhood blog/news site. Hoy Kids is turning into a regular column. And my baby boy is on the front page !</p>
<p><a title="Hoy Kid 10.14 to 10.20" href="http://missionlocal.org/2009/10/hoy-kid10-1/">Read the article&gt;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dragishak.com/?feed=rss2&#038;p=72</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
