<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-34926058</id><updated>2011-10-10T09:30:58.146-07:00</updated><category term='hibernate'/><category term='http://2.bp.blogspot.com/_rOeRnnmMxi0/TQj7DAevqWI/AAAAAAAAACk/V3fZ6ihZSQM/s1600/ehcache-to-the-rescue.jpg'/><category term='iphone'/><category term='macbook air'/><category term='scale'/><category term='ehcache'/><category term='quartz scheduler'/><category term='distributed cache'/><category term='spring'/><category term='apple guide'/><category term='mac'/><category term='macbook'/><category term='ipad'/><category term='performance'/><category term='terracotta'/><category term='apple deal'/><category term='cloud'/><category term='ehcache example'/><title type='text'>DSO Guy</title><subtitle type='html'>Random thoughts about Software and other stuff...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>78</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34926058.post-6389854041120878583</id><published>2011-09-25T20:16:00.001-07:00</published><updated>2011-09-25T20:17:03.010-07:00</updated><title type='text'>New Home...</title><content type='html'>Hey readers. Just a heads up that as of today I'm doing my posting over at &lt;a href="http://scaleaholic.blogspot.com/"&gt;http://scaleaholic.blogspot.com&lt;/a&gt;. Check it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-6389854041120878583?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/6389854041120878583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=6389854041120878583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6389854041120878583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6389854041120878583'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/09/new-home.html' title='New Home...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-6998239115046303323</id><published>2011-08-01T08:09:00.001-07:00</published><updated>2011-08-02T20:13:00.180-07:00</updated><title type='text'>What Is Terracotta?</title><content type='html'>One of the biggest challenges in software is telling people what your software is in a way that helps them make decisions about it. This challenge can often be as difficult as designing and building the software itself. The &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; team recently hooked up with the gang from &lt;a href="http://www.epipheostudios.com/"&gt;Epipheo&lt;/a&gt; studios to create a 2 minute video to do just that. We spent a lot of time thinking about and refining things in order to get a clear succinct message. I think it came out quite well. &lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Check it out:&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="360" height="249" src="http://www.youtube.com/embed/aAZnsofBV-I" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-6998239115046303323?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/6998239115046303323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=6998239115046303323' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6998239115046303323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6998239115046303323'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/08/what-is-terracotta.html' title='What Is Terracotta?'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/aAZnsofBV-I/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-6741595327610572050</id><published>2011-07-11T18:13:00.000-07:00</published><updated>2011-07-12T09:38:06.692-07:00</updated><title type='text'>Easy Java Performance Tuning: Manage Objects By Size On The Java Runtime Heap</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/-5pLyhgAcaM8/Thu1hCRP54I/AAAAAAAAADw/uc_B6YDpPfc/s1600/TSA.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;The Problem?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For those of you who use caching with things like &lt;a href="http://ehcache.org/documentation/hibernate.html"&gt;Hibernate&lt;/a&gt;, Spring or anything else, you know what a pain performance tuning can be. The tools you have available for tuning, resource management and avoiding OOME's boil down to counts and age controls. These are actually not resource management controls at all. They are data freshness controls and should be treated as such.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How do you even begin to figure out how many entries to allow in each &lt;a href="http://ehcache.org/documentation/hibernate.html"&gt;Hibernate cache&lt;/a&gt; when you have a hundred of them? What if things change and objects get bigger, or smaller. What if you change your heap size and/or usage patterns? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;You've Gotta Try This...&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With &lt;a href="http://www.terracotta.org/beta"&gt;Ehcache 2.5 Beta1&lt;/a&gt; you can just &lt;a href="http://ehcache.org/documentation/configuration.html#Memory_Based_Cache_Sizing_Ehcache_2.5_and_higher"&gt;specify a percentage of heap or a heap size&lt;/a&gt; in bytes that your graphs of Java objects are allowed to use. This is accomplished by passing a simple size description into a Cache or CacheManager. All objects held onto by the cache will borrow their space from the cache's or manager's specified pool. Entries will get evicted from the cache as space runs low without any intervention from the developer. This can be done at the Cache Tier level whether it's on heap, disk or &lt;a href="http://www.terracotta.org/bigmemory"&gt;BigMemory&lt;/a&gt;. It's another way to reduce tuning, improve performance while avoiding OOME's. Learn more &lt;a href="http://ehcache.org/documentation/configuration.html#Memory_Based_Cache_Sizing_Ehcache_2.5_and_higher"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/-5pLyhgAcaM8/Thu1hCRP54I/AAAAAAAAADw/uc_B6YDpPfc/s400/TSA.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5628291738479093634" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 378px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;If you do things in config or in code it's just a one line change:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/1077193.js?file=gistfile1.java"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;A few More Details...&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;It works on any 1.5 or 1.6 JVM (Tested on Oracle, JRocket and IBM). Doesn't require any object serialization for the on heap management.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Learn More:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://ehcache.org/documentation/configuration.html#Memory_Based_Cache_Sizing_Ehcache_2.5_and_higher"&gt;http://ehcache.org/documentation/configuration.html#Memory_Based_Cache_Sizing_Ehcache_2.5_and_higher&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.terracotta.org/beta"&gt;http://www.terracotta.org/beta&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dsoguy.blogspot.com/2011/04/biggest-problems-in-local-caching.html"&gt;http://dsoguy.blogspot.com/2011/04/biggest-problems-in-local-caching.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Try it out and give us lots of feedback on the Terracotta Forums:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://forums.terracotta.org/"&gt;http://forums.terracotta.org&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-6741595327610572050?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/6741595327610572050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=6741595327610572050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6741595327610572050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6741595327610572050'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/07/easy-java-performance-tuning-manage.html' title='Easy Java Performance Tuning: Manage Objects By Size On The Java Runtime Heap'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-5pLyhgAcaM8/Thu1hCRP54I/AAAAAAAAADw/uc_B6YDpPfc/s72-c/TSA.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-6498477443056454297</id><published>2011-05-22T23:37:00.000-07:00</published><updated>2011-05-22T23:51:10.725-07:00</updated><title type='text'>Exciting Times... Terracotta and Software A.G.</title><content type='html'>Exciting times over here at Terracotta.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Read all about it:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.softwareag.com/corporate/company/terracotta.asp"&gt;http://www.softwareag.com/corporate/company/terracotta.asp&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Helvetica;font-size:medium;"&gt;&lt;a href="http://terracotta.org/terracotta-joins-software-ag"&gt;http://terracotta.org/terracotta-joins-software-ag&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.terracottatech.com/2011/05/terracotta_joins_software_ag.html"&gt;http://blog.terracottatech.com/2011/05/terracotta_joins_software_ag.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is great news for Ehcache, Quartz, and Terracotta customers and communities!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-6498477443056454297?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/6498477443056454297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=6498477443056454297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6498477443056454297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6498477443056454297'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/05/exciting-times-terracotta-and-sag.html' title='Exciting Times... Terracotta and Software A.G.'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-6741008821067083219</id><published>2011-04-20T08:22:00.000-07:00</published><updated>2011-07-01T13:47:59.286-07:00</updated><title type='text'>Local Caching++</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Ok, so you've built your application in Java. You've used all the usual tools. Tomcat, Spring, &lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt;, &lt;a href="http://quartz-scheduler.org/"&gt;Quartz&lt;/a&gt;, etc. Or maybe you went the &lt;a href="http://ehcache.org/documentation/jruby.html"&gt;JRuby&lt;/a&gt;, &lt;a href="http://ehcache.org/documentation/grails.html"&gt;Grails&lt;/a&gt; or Scala route. You test your new application or hand it off to run in production and it's too slow. This is just a single node application at this point. It services 20-100 users. It's churning and burning the database, creating and recreating the same Web Pages, Users and other relevant data. You want to start caching locally to solve  your latency and throughput problems. Then, upon a more detailed look at your application, you get scared.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You find your application has:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;40 DB tables in Hibernate that can be cached&lt;/li&gt;&lt;li&gt;A web cache&lt;/li&gt;&lt;li&gt;A user session cache&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Then it hits you. Caching is easy but cache tuning is hard.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What Makes Cache Tuning Hard?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In conversations with 100's of cache users there are actually a small handful of difficult to work through challenges applying caching to an application:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;Hibernate/&lt;/b&gt;&lt;/span&gt;Lots of caches &lt;/b&gt;- When using Hibernate you often end up with as many as 100 tables in your DB. How do you balance a fixed amount of resources(Heap/&lt;a href="http://ehcache.org/documentation/offheap_store.html"&gt;BigMemory&lt;/a&gt;) across 100 caches?&lt;/li&gt;&lt;li&gt;&lt;b&gt;Indirect knobs/Bytes vs Count/TTL&lt;/b&gt; - In local Java caching the control points are almost always measured in number of entries and time to live. But wait a minute! When I start the JVM I don't say how many objects the heap can hold and for how long. I say how many bytes of memory the heap can use?&lt;/li&gt;&lt;li&gt;&lt;b&gt;Who Tunes and When?&lt;/b&gt; - At some companies the desire is to have the "Application Administrator" do the tuning. At others it's the "Developer." They have different understandings of the application. The developer can tune by knowledge of the application. The app admin can only tune based on what's happening when the application is running.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;These are the challenges we are working to solve in the next version of Ehcache. While it's early days on the dev side we would love feedback on our approaches. You can get a sense of how it's going to &lt;a href="http://ehcache.org/documentation/configuration.html#Memory_Based_Cache_Sizing_Ehcache_2.5_and_higher"&gt;work from the doc on ehcache.org&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What We Are Building&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Greg, me and the dev team spent a bunch of time pondering the above problems over the last few years. We felt that with two key improvements to how people tune we could address most of the above (and a few more items hit the rest):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Tune from the top&lt;/b&gt; - Define max resource usage for the whole cache manager and then optionally define it for the individual caches underneath it as needed. So if you have a hundred caches you can start with, "Give these 100 caches N amounts of Heap/OffHeap." Then monitor and see if any specific caches need special attention.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Tune the constrained resource, Bytes&lt;/b&gt; - TTL is a cache freshness concern not a resource management concern. Max entry count does not directly map to available heap resources. So we are adding "bytes" based tuning. This eliminates the mistake prone process of trying to control resources by TTL/TTI/count and hope  you get it right. Instead you say, "I want to allow caching to use 30 percent of heap." We take it from there.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Wrapping Up&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With those two key improvements a developer or admin is now directly turning the knob (Size of cache in bytes) that maps to the resources available in the JVM and doing it at a global level or a local level as needed to avoid hard to tune individual cache constraints.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This will work with all of our JVM level cache tiers (onHeap, &lt;a href="http://ehcache.org/documentation/offheap_store.html"&gt;BigMemory&lt;/a&gt;, Disk).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you put those features together with other items coming in the next major release like entry and &lt;a href="http://ehcache.org/documentation/configuration.html#Pinning_of_Caches_and_Elements_in_Memory"&gt;cache pinning&lt;/a&gt; and a &lt;a href="http://ehcache.org/documentation/configuration.html#Cache_Warming_for_multi-tier_Caches_Ehcache_2.5_and_higher"&gt;snapshotting bootstrapper for warming&lt;/a&gt; we feel like this will be a very powerful release.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please check out the new docs and give us feedback by commenting on this blog or posting the the &lt;a href="http://forums.terracotta.org/"&gt;Ehcache forums&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Help us make Ehcache as easy to use and powerful as we possibly can.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://ehcache.org/documentation/configuration.html#Memory_Based_Cache_Sizing_Ehcache_2.5_and_higher"&gt;http://ehcache.org/documentation/configuration.html#Memory_Based_Cache_Sizing_Ehcache_2.5_and_higher&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-6741008821067083219?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/6741008821067083219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=6741008821067083219' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6741008821067083219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6741008821067083219'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/04/biggest-problems-in-local-caching.html' title='Local Caching++'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-546703353803706123</id><published>2011-04-16T08:20:00.001-07:00</published><updated>2011-04-16T19:03:13.437-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='macbook air'/><category scheme='http://www.blogger.com/atom/ns#' term='apple guide'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='apple deal'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><category scheme='http://www.blogger.com/atom/ns#' term='macbook'/><title type='text'>Where To Buy Your Apple Gear?</title><content type='html'>&lt;div style="text-align: left;"&gt;Most people who know me think I'm a bit of an &lt;a href="http://www.apple.com/"&gt;Apple&lt;/a&gt; products junkie. I can't deny it. I'm a big fan of Apple products (Typing this blog on my &lt;a href="http://www.macmall.com/p/product~dpno~8233536~pdp.gcgaeid;jsessionid=856D67B0B82F7ED7B4FE6E5D7CB0A114?source=APPINSDRMWB27133"&gt;11.6 inch Macbook Air&lt;/a&gt;) and the way they package and reuse great ideas across devices. Being that I'm such a fan(boy) of the Apple ecosystem I'm regularly asked for advice from wood be purchasers when they want to pickup an Apple product. I'm writing this blog in order to provide that product purchase advice for my friends and family as well as for my readers who can't ask me verbally.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;"Speed of Acquisition" vs "Help During Purchase" vs "Total Cost"&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The decision making process for where to buy Apple products usually comes down to three major questions. How do you rate "Speed of Acquisition" vs "Help During Purchasing" vs "Total Cost?" (See diagram for the big picture on this issue). Once you know the answer to the above question based on your keen sense of self awareness you can then weight the various purchase options appropriately. For best results, Be Honest With Yourself! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;NOTE: Many people think after sale help is somehow related to the purchase decision. IT IS NOT! The Apple store Genius bar will always help you no matter where you bought the device.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What's In The Cost?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;When buying an Apple product there are 4 components to the cost of the device:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;The price tag of the device itself&lt;/li&gt;&lt;li&gt;State sales tax&lt;/li&gt;&lt;li&gt;Shipping and Handling&lt;/li&gt;&lt;li&gt;What you can get thrown into the deal&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Take into consideration all four points when looking at the price. You can often save over a hundred dollars in sales tax just by ordering from an out of state, online retailer! In addition, many of these online retailers ship for free. These online retailers usually have the best discounts aka "price tag" on devices as well. Check out the &lt;a href="http://www.appleinsider.com/mac_price_guide/"&gt;AppleInsider.com price guide&lt;/a&gt;. It will tell you where to get the best deal on any given Apple device and is kept very up to date. It's where I look and where you should too. Another thing to consider is that on some items &lt;a href="http://www.macmall.com/home"&gt;MacMall&lt;/a&gt; and &lt;a href="http://www.macconnection.com/"&gt;MacConnection&lt;/a&gt; are actually flexible and may throw in things like printers and bags if you call.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Need For Speed?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Some people are impatient, some people need a computer right away, and others just like the experience of being first. These are all speed questions. In the speed world there are two categories of Apple products "Hot and Constrained" and "Generally Available."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Hot and Constrained &lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If we are talking about "Hot and Constrained" usually the fastest way to get a product is buying it from Apple. Either through their online store or going to an Apple Retail location. They stock themselves first. You may have to wait on lines but it's often your best and sometimes your only bet for acquiring new, hot, Apple devices.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;General Availability&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;For "general availability" devices "fastest" is broken down again into two categories. Fastest online (Generally Amazon) and fastest brick and mortar (Generally Apple's stores). &lt;a href="http://Amazon.com/"&gt;Amazon&lt;/a&gt; is generally the best place to buy anything online as far as fulfillment (How fast they get it to you, amount in stock, ease of using store, return policies) and Apple products are no exception. Amazon's prices aren't the absolute bottom but they are pretty darn good.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When buying from a retail store, Apple's is second to none. They get you in and out fast, have all the information you need, it's easy to find what you want and they have ton's of stock of everything Apple. The only downside is the sales tax and no discounts to speak of.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Help During Purchasing&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This one doesn't apply to me as when it comes to Apple products I tend to know what I want. It's a hobby of mine to monitor Apple's products and product direction. I use product and business learning from Apple for inspiration in my job building &lt;a href="http://www.terracotta.org/"&gt;Performance and Scale&lt;/a&gt; software (Probably a good blog topic as well. "How I Apply My Apple Learnings To My Business"). For the rest of the world, aka "normal people," who spend precious free time doing things like traveling, dating, hanging out with friends, help might be required. For those people you should probably lean towards either the &lt;a href="http://www.apple.com/retail/"&gt;Retail Apple Stores&lt;/a&gt; and or the online Apple Product specialists (MacMall and MacConnection) where they know everything about the devices and can help you make good decisions. For those who are like me, stick to "Total Cost" and "Speed" in your decision making process.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusions&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;When looking to buy an Apple device one must evaluate a number of options. You should evaluate those options against a keen sense of self awareness? Can you wait, are you cost conscious, do you need help? By answering those questions and comparing the results against the "Apple Product Purchasing Guide" diagram below, the AppleInsider price guide and the above criteria you should be able to make the best possible decision for you.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please let me know if you have any feedback about this blog. How can it be more helpful? Where did I get it wrong?&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;a href="http://4.bp.blogspot.com/-pFuj3v2ldj4/Tanrgur6snI/AAAAAAAAADU/v3cT0VxThwY/s1600/ApplePurchases.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-pFuj3v2ldj4/Tanrgur6snI/AAAAAAAAADU/v3cT0VxThwY/s400/ApplePurchases.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5596262959505126002" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 197px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-546703353803706123?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/546703353803706123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=546703353803706123' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/546703353803706123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/546703353803706123'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/04/where-to-buy-your-apple-gear.html' title='Where To Buy Your Apple Gear?'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pFuj3v2ldj4/Tanrgur6snI/AAAAAAAAADU/v3cT0VxThwY/s72-c/ApplePurchases.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-1961329905138944050</id><published>2011-04-13T13:26:00.001-07:00</published><updated>2011-04-13T14:09:57.180-07:00</updated><title type='text'>Please Strengthen My Weak LinkedIn Links...</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;b&gt;State Of LinkedIn&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I've had a &lt;a href="http://LinkedIn.com"&gt;LinkedIn&lt;/a&gt; account for many years. I find it an excellent tool for keeping tabs on ex-coworkers, recruiting new ones, and watching job trends. The problem I have is that those links/connections in LinkedIn can be weak. It doesn't take those connections to the next level by helping me manage the relationships. It doesn't help me manage and monitor the strengthen of my connections.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What Does Manage and Monitor Relationships Mean?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;At a macro level I can keep track of my first level connections and second level connections. I can traverse these to help me find people to hire, ask for advice and even look for jobs myself. It even does a ton of stuff to help me find new connections by making suggestions, forming groups etc.  But at a micro level it does nothing to help me improve and make value judgements about those relationships. I.e. I have a relationship with Joe the CEO of SomeCompany.com. By looking at that link I can't tell if that's a strong relationship or a weak one (Monitoring). I also can't set goals of improving my relationships and keep track of those goals (Managing). It just gives me a tree/graph of the relationships as if they were all the same. Further, when I'm traversing through my relationships and into my connections relationships I can't tell how strong they are connected to their connections.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What I Want...&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;What I really want is for LinkedIn to help me manage and improve my relationships as well. It would all be much more powerful if I could apply a rating to each relationship, monitor the relationship's progress and assign goals for each relationship. I could do so on a 1-10 scale.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So instead of a graph like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-t75iw718sjM/TaYM0Kan9_I/AAAAAAAAAC8/4G-LhsUkd6Q/s400/LinkedInRelationshipsToday.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5595173677343176690" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 382px; height: 168px; " /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I could have a graph like this where the thickness of the lines indicated the quality of the relationship where it is right now:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/-8OrDicgvjiw/TaYNQS83WDI/AAAAAAAAADE/ipuGPXiOJVo/s400/LinkedInRelationshipsTomorrow.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5595174160670611506" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 382px; height: 168px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;That would be a great start. Then I would like it to keep a history of the relationship as well. It could show me how the relationship is progressing over time. Say it started at a 10 but I haven't talked to Joe in 3 years and now I rate it a 4. It could represent it with little arrows or color showing deterioration. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What about goals for a relationship? I could set a goal of 8 and do a query on all relationships that are not at the level I wish they were. It could remind me to make a quick contact with the person in question. It could auto deteriorate a relationship over time if I don't contact people.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Summing Up...&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;LinkedIn is great. I'm more connected than ever. But... I want to monitor and manage my links to improve my connectedness to certain people and I'm hoping linked in can help me. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-1961329905138944050?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/1961329905138944050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=1961329905138944050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1961329905138944050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1961329905138944050'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/04/please-strengthen-my-weak-linkedin.html' title='Please Strengthen My Weak LinkedIn Links...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-t75iw718sjM/TaYM0Kan9_I/AAAAAAAAAC8/4G-LhsUkd6Q/s72-c/LinkedInRelationshipsToday.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2954641734988344696</id><published>2011-03-24T17:02:00.000-07:00</published><updated>2011-03-29T12:33:18.379-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='terracotta'/><category scheme='http://www.blogger.com/atom/ns#' term='scale'/><category scheme='http://www.blogger.com/atom/ns#' term='ehcache'/><category scheme='http://www.blogger.com/atom/ns#' term='quartz scheduler'/><title type='text'>"What" "When" and "Where" ... Quartz Scheduler 2.0 Goes GA</title><content type='html'>&lt;b&gt;What is Quartz?&lt;/b&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://quartz-scheduler.org/"&gt;Quartz&lt;/a&gt; is &lt;b&gt;The Lightweight, Open Source, Enterprise-class Job Scheduler&lt;/b&gt; for Java. For years Quartz has put the "When" in Java applications via it's full featured scheduling capabilities. As a result, from Spring to JBoss, Quartz is embedded in just about every major Java product. Quartz is extremely robust and full featured providing things like HA, Transaction Support and all the precise guarantees one needs to assure reliable Job execution. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Terracotta has done a number of incremental improvements since taking over stewardship of Quartz. We've been evolving Quartz one step at a time while collecting what features the Quartz  community were really interested in. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quartz 2.0 is the realization of those user requested features!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;"What" "When" and "Where"&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Let's step back a bit and review where Quartz fits in the Terracotta world view. As most people know &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; is focused on adding Snap-in performance to JVM based applications through Scale-out (&lt;a href="http://www.terracotta.org/enterprise-suite/"&gt;Terracotta Server Array&lt;/a&gt;), Scale-up (&lt;a href="http://www.terracotta.org/bigmemory"&gt;BigMemory&lt;/a&gt;) and Speed-up (&lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt;). We do this while maintaining our goals of &lt;a href="http://dsoguy.blogspot.com/2010/04/clustered.html"&gt;simplicity&lt;/a&gt;, &lt;a href="http://dsoguy.blogspot.com/2010/09/little-bit-about-bigmemory-for-ehcache.html"&gt;predictability&lt;/a&gt;, and &lt;a href="http://dsoguy.blogspot.com/2011/01/ehcache-at-2-billion.html"&gt;density&lt;/a&gt; (can your datastore hold 2 billion entries per node in-memory?) throughout our product line. We view this data layer scaling layer as solving the "What" or the data problem of an application. But when going from 1 to many nodes that's just the first of two major scale points.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Up until now, Quartz Scheduler has been solely focused on the "When" part of code execution. Making sure "code execution" happens exactly "When" it's supposed. It has been pretty much ubiquitous in that space with literally 100s of thousands of users. While it Scaled-out with JDBC and Terracotta, it gave precious little control over where jobs execute.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With &lt;a href="http://www.terracotta.org/quartz/"&gt;Quartz Scheduler&lt;/a&gt; 2.0 we've now added that "Where." This is about where code executes. Instead of randomly choosing a node for job execution in a scaled-out architecture you can now create constraints that help make the decision based on "Where" it should be executed. You can do this based on:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Resource Availability&lt;/b&gt; - CPU available, Memory Available, custom constraints&lt;/li&gt;&lt;li&gt;&lt;b&gt;Ehcache's data locality&lt;/b&gt; - Bring the work to where the data is&lt;/li&gt;&lt;li&gt;&lt;b&gt;Static allocation&lt;/b&gt; - Just decide where it goes&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;This gives Terracotta the ability to Snap-in and handle both the major scale-out points.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What's new in Quartz 2.0&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The simple answer is A LOT!&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.quartz-scheduler.org/docs/2.0/newInQuartz2.html"&gt;Easy to use Fluent API&lt;/a&gt; - Quartz 2.0 has a new, easy to use fluent interface that hides the complexity of building out the description of your jobs behind a simple description of what you want to happen and when. I wrote a short&lt;a href="http://dsoguy.blogspot.com/2010/11/quartz-scheduler-20-beta-1-welcomes-new.html"&gt; blog about this when it was in beta&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.terracotta.org/quartz/"&gt;Quartz "Where"&lt;/a&gt; - Constraint based system for controlling where jobs execute based on things like CPU and Memory usage, OS, and Ehcache data locality&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.terracotta.org/quartz"&gt;Quartz Manager&lt;/a&gt; - A flash based GUI console for managing and monitoring your scheduler in production.&lt;/li&gt;&lt;li&gt;Batching - Helps improve a schedulers throughput by allowing one to make trade-offs between perfect time execution and benefiting from batching.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.quartz-scheduler.org/docs/2.0/newInQuartz2.html"&gt;Ton's of bug fixes and features&lt;/a&gt; - Lots of long requested features. Check out the link for the list.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Quartz 2.0 Is Now GA&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Quartz 2.0 makes a big leap in usability, power, visibility and management and it's NOW GA. We did this while maintaining Quartz's reliability and predictability. We focused on making sure existing users would have an easy time moving forward so &lt;a href="http://quartz-scheduler.org/docs/2.0/migrationGuide.html"&gt;check out the migration guide &lt;/a&gt;if you need help. It really is the next generation of Quartz. Give it a try and give us feedback as we are constantly working to make things better!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;More Reading&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codespot.net/blog/2010/12/quartz-where/"&gt;http://www.codespot.net/blog/2010/12/quartz-where/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codespot.net/TC/QuartzWhere.m4v"&gt;Quartz Scheduler "Where" Screencast&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/5433799/QuartzManager.mp4"&gt;Quartz Manager Screencast&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://quartz-scheduler.org/docs/2.0/newInQuartz2.html"&gt;What's new in Quartz 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.terracotta.org/quartz"&gt;Quartz Scheduler&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2954641734988344696?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2954641734988344696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2954641734988344696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2954641734988344696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2954641734988344696'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/03/what-when-and-where-quartz-scheduler-20.html' title='&quot;What&quot; &quot;When&quot; and &quot;Where&quot; ... Quartz Scheduler 2.0 Goes GA'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-8825950373656204205</id><published>2011-02-14T21:02:00.000-08:00</published><updated>2011-02-15T16:18:15.045-08:00</updated><title type='text'>Quick 5:41 Intro To Ehcache Search (Now GA)</title><content type='html'>&lt;a href="http://www.terracotta.org/ehcache/"&gt;Ehcache 2.4&lt;/a&gt; went GA today. Still lightweight (under 1MB) and still backward compatible to 1.x so no reason not to give it a try. Below are the highlights and a short video on getting started with Ehcache Search:&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dsoguy.blogspot.com/2010/11/couple-minutes-with-ehcache-search.html"&gt;Search&lt;/a&gt; - Brand new search API. Allows one to get beyond the key based lookup of objects (&lt;a href="https://github.com/sharrissf/Ehcache-Search-Sample/downloads"&gt;Check out this sample&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://ehcache.org/documentation/jta.html"&gt;Local Transactions&lt;/a&gt; - Fast optimistic concurrency without the need for a TransactionManager (&lt;a href="https://github.com/sharrissf/Ehcache-Local-Transaction-Sample/downloads"&gt;Check out this sample&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://dsoguy.blogspot.com/2011/01/ehcache-at-2-billion.html"&gt;Bigger BigMemory&lt;/a&gt; (ee) - 2 Billion entries, 1.3 million TPS, Extreme predictability for meeting SLA's&lt;/li&gt;&lt;li&gt;Bigger Disk Store (ee) - Swap your Ehcache to disk. Grow to hundreds of gigs with &lt;b&gt;no on heap footprint&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;In the past I've enjoyed short videos that teach me something. This is my first try at doing one to benefit others.  I've created this short 5 minute 41 second video to get people started on using Ehcache Search... &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dl.dropbox.com/u/6713416/Intro%20To%20Ehcache%20Search%20Screencast.pdf"&gt;Here's the Slides...&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;embed src="https://terracotta.box.net/embed/mv3va4gbcb42ad7.swf" width="400" height="400" wmode="opaque" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-8825950373656204205?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/8825950373656204205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=8825950373656204205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8825950373656204205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8825950373656204205'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/02/541-seconds-with-ehcache-search-ga.html' title='Quick 5:41 Intro To Ehcache Search (Now GA)'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4393021190919060667</id><published>2011-01-26T14:19:00.000-08:00</published><updated>2011-02-02T09:09:40.544-08:00</updated><title type='text'>Ehcache At 2 Billion...</title><content type='html'>&lt;span class="Apple-style-span"   style="  ;font-family:Times;font-size:medium;"&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;What's Up With Ehcache 2.4&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;a href="http://www.ehcache.org/"&gt;Ehcache&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt; is the de facto caching standard for Java that &lt;/span&gt;&lt;a href="http://ehcache.org/customers.html"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;everyone uses&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt; (500,000+ production deployments; the &lt;a href="http://terracotta.org/resources/whitepapers/ehcache-user-survey-whitepaper"&gt;majority of enterprise Java applications&lt;/a&gt;).  Ehcache 2.4 is coming out soon and includes some capabilities that will make it even easier to use, more powerful, while still maintaining it's light weight.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The highlights include:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;a href="http://ehcache.org/documentation/search.html"&gt;Search&lt;/a&gt; - Quickly find entries based on the criteria of your choosing. String matching, dates, ranges, sums, averages etc.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;a href="http://ehcache.org/documentation/jta.html"&gt;Fast local transactions&lt;/a&gt; - Improved performance of JTA and added a new non-jta transaction api for user level control&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;Even more capacity and performance&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;What I've been Testing&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;a href="http://dsoguy.blogspot.com/2010/09/little-bit-about-bigmemory-for-ehcache.html"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;I've written before&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt; about &lt;/span&gt;&lt;a href="http://terracotta.org/bigmemory"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;BigMemory for Enterprise Ehcache &lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;and how it solves the problem of long, unpredictable GC pauses in Java. The first release of BigMemory was… well, big.  In Enterprise Ehcache 2.4, BigMemory has gotten even bigger.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;Using the Enterprise &lt;/span&gt;&lt;a href="http://dsoguy.blogspot.com/2010/10/couple-minutes-with-ehcache-bigmemory.html"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;Ehcache Big Memory Pounder&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt; I was able to show that Enterprise Ehcache 2.4 now easily handles:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;Entry Count:&lt;/b&gt; &gt; &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;2 billion entries&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt; (I reached 2 billion on the hardware I had; with bigger hardware, I could probably have gone much higher).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;Throughput:&lt;/b&gt; 1.3 million operations per second (symmetric read and write; CPU bound)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;SLA/Predictability: &lt;/b&gt;No GC pauses and a predictable 38-42 ops/thread/millisecond throughout the test&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;Data Size:&lt;/b&gt; 1-350 GB in-memory cache (again, I was limited by the hardware I had; with more RAM, I could probably have gone much higher)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;Flexible Efficient Entry Sizes:&lt;/b&gt; The cache can now dynamically handle very large (10-100 MB) and very small entries (just a few bytes) together more efficiently with no tuning (This test used small entries in order to fit as many entries as possible into the memory I had. I also ran tests with fewer entries in order to validate wide ranging sizes)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;Tuning:&lt;/b&gt; All tests were done with &lt;b&gt;NO TUNING&lt;/b&gt;. Right out of the box.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;Here's the hardware and software stack I used for my testing:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;Cisco UCS C250 Server&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;Dual Intel x5670 2.93 Ghz CPU&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;384 GB RAM ( 8 GB x 48)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;Redhat 5.4 Enterprise Edition&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;Sun JDK 1.6_22&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;For this test, all of the data was in memory. &lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;A Bit About Ehcache BigMemory&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;BigMemory is 100% pure Java and in process with a Java application. No magic or special JVMs (works on IBM and JRocket as well). The cache data is safely hidden away from Java GC and the pauses that occur with large heaps by instead storing data in a &lt;/span&gt;&lt;a href="http://ehcache.org/documentation/offheap_store.html"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;BigMemory off-heap store&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;. &lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;Embedding&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;BigMemory got it's start as a component in the Terracotta Server Array and as a result it is particularly useful for embedding. It's performance characteristics and no tuning approach improves "The Out Of The Box Experience" and saves money on support by removing tuning required by users and problems caused by GC pauses.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;b&gt;You may be thinking...&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;"I don't have 2 billion entries in my caches?"&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;That's ok. Ehcache is a lightweight core library (under 1MB) for caching that's ubiquitous and easy to use. W&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;hen it's needed, Ehcache lets you scale up and out to billions of entries and terabytes of data. It does so at a manageable server density without changing code/architecture and without a bunch of tuning and learning. This protects not only your knowledge investment but your code investment.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;More about BigMemory for Enterprise Ehcache:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;a href="http://terracotta.org/bigmemory"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;http://terracotta.org/bigmemory&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;a href="http://terracotta.org/resources/whitepapers/bigmemory-whitepaper"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;BigMemory Whitepaper&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;a href="http://ehcache.org/documentation/offheap_store.html"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;BigMemory Documentation&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;More about the 2010 Ehcache user survey:&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Times; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:medium;"&gt;&lt;a href="http://terracotta.org/resources/whitepapers/ehcache-user-survey-whitepaper"&gt;Ehcache User Survey Whitepaper&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4393021190919060667?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4393021190919060667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4393021190919060667' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4393021190919060667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4393021190919060667'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2011/01/ehcache-at-2-billion.html' title='Ehcache At 2 Billion...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2202630264483215699</id><published>2010-12-15T09:05:00.000-08:00</published><updated>2010-12-15T09:38:28.744-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http://2.bp.blogspot.com/_rOeRnnmMxi0/TQj7DAevqWI/AAAAAAAAACk/V3fZ6ihZSQM/s1600/ehcache-to-the-rescue.jpg'/><title type='text'>Ehcache To The Rescue (Comic Strip)</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: 15.9722px; "&gt;&lt;div style="text-align: left;"&gt;Working on a product that has as much adoption as &lt;a href="http://www.ehcache.org"&gt;Ehcache&lt;/a&gt; is extremely rewarding. Every day millions of people's applications run faster with this tiny little library. It's one of those, "Of course I use it, doesn't everyone " kinds of products and what Greg Luck has accomplished with it is really amazing. One of the challenges we face as we improve and extend it's functionality is getting the story out to those million or so users. Yes, it's still an extremely fast extremely light weight library that pretty much everyone just uses. But it also future proofs your app with snap-in scale-up, scale-out and HA each with just 2 lines of configuration.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;In the coming release we are adding &lt;a href="http://dsoguy.blogspot.com/2010/11/ehcache-24-beta-1-welcomes-txs-search.html"&gt;Search, Local Transactions and an even better BigMemory&lt;/a&gt; (We've been regularly testing with 2 billion entries in memory with linear, predictable, fast, performance but that's another blog) and we want people to know about this stuff, try it, and give feedback so we can constantly make it better.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: 15.9722px; "&gt;Anyway, after watching an inspiring talk from &lt;a href="http://www.edwardtufte.com/tufte/"&gt;Edward Tufte&lt;/a&gt; on visual representation I've been experimenting with ideas on how to teach people about Ehcache in quick, fun ways. In the process I wrote my very first comic strip. Check it out...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://stripgenerator.com/strip/454991/ehcache-to-the-rescue/"&gt;Ehcache To The Rescue Comic Strip...&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"  style=" -webkit-text-decorations-in-effect: underline; font-size:15.9722px;"&gt;&lt;img src="http://1.bp.blogspot.com/_rOeRnnmMxi0/TQj7llQoVxI/AAAAAAAAACs/CvVcFiWreKQ/s400/ehcache-to-the-rescue-full.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5550963163809732370" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 311px; " /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"  style=" -webkit-text-decorations-in-effect: underline; font-size:15.9722px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2202630264483215699?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2202630264483215699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2202630264483215699' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2202630264483215699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2202630264483215699'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/12/ehcache-to-rescue-comic-strip.html' title='Ehcache To The Rescue (Comic Strip)'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_rOeRnnmMxi0/TQj7llQoVxI/AAAAAAAAACs/CvVcFiWreKQ/s72-c/ehcache-to-the-rescue-full.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-425482859620659725</id><published>2010-11-29T15:26:00.001-08:00</published><updated>2010-12-03T14:32:28.631-08:00</updated><title type='text'>Quartz Scheduler 2.0 Beta 1 Welcomes New Fluent API and "Where"</title><content type='html'>&lt;div&gt;&lt;a href="http://www.quartz-scheduler.org/"&gt;Quartz Scheduler&lt;/a&gt;, the most widely used Java scheduler is getting some major improvements for 2.0. I'm going to talk a little about what to expect but you can also read the &lt;a href="http://docs.terracotta.org/confluence/display/release/Fremantle+Beta+Release+Notes"&gt;release notes here&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Goals&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We had two major goals when planning for Quartz 2.0 began. &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Simplify/modernize the Quartz  API. &lt;/li&gt;&lt;li&gt;Improve the Quartz experience when leveraging a cluster&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Quart 2.0 API&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In order to improve the usability and readability of Quartz 2.0 over passed versions  we spent a lot of time evaluating the parts and how a user interacts with them. We found that too much knowledge of those parts needed to be understood at construction time. As a result we moved to a "&lt;a href="http://en.wikipedia.org/wiki/Fluent_interface"&gt;Fluent API&lt;/a&gt;/&lt;a href="http://weblogs.java.net/blog/carcassi/archive/2010/02/04/building-fluent-api-internal-dsl-java"&gt;DSL&lt;/a&gt;" approach. The best way to get a feel for the kind of improvement this gives is to compare the samples from 1.8.4 to the same ones translated in 2.0 Beta 1.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the simple of case of example 1 from the Quartz Kit you can see the basic philosophy change:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/720867.js?file=gistfile1.java"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Improvements include:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The date/time related methods have been moved off of the Trigger and Job classes into a Date building class called "DateBuilder"&lt;/li&gt;&lt;li&gt;We've removed the need to know details about which Job and Trigger classes you need and instead infer them through the building methods you call. &lt;/li&gt;&lt;li&gt;The construction now reads more like a sentence. new job withIdentity "job1", "group1". new trigger withIdentity "trigger1", "group1" start at runTime &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;This is pretty subtle in a simple case like example 1 but gets more obvious as the cases get more complex. Let's look at example 2.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/720905.js?file=gistfile1.java"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this case notice how the constructors are growing with no real indication to what each parameter means.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now lets look at an example where you have to choose a specific Trigger type.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/720910.js?file=gistfile1.java"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This example shows how in Quartz 1.8.4 you would have to know to select a different Trigger type but in 2.0 it's just abstracted away in the scheduling.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's worth going through the samples yourself and making any suggestions you may have. Still plenty of time to get your API suggestions in via the &lt;a href="http://forums.terracotta.org/forums/forums/show/17.page"&gt;Quartz Forum&lt;/a&gt;!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Quartz "Where" And Other Improvements&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Clustered Quartz has gotten two major improvements in 2.0. Improved performance as node count increases and Quartz "Where"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wrote a &lt;a href="http://dsoguy.blogspot.com/2010/07/quartz-scheduler-heading-for-20-and.html"&gt;blog about this a while back&lt;/a&gt; but now you can play with it. Alex Snaps has written an &lt;a href="http://www.codespot.net/blog/2010/12/quartz-where/"&gt;excellent blog with code samples on the topic&lt;/a&gt;. Check it out to really dig in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-425482859620659725?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/425482859620659725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=425482859620659725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/425482859620659725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/425482859620659725'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/11/quartz-scheduler-20-beta-1-welcomes-new.html' title='Quartz Scheduler 2.0 Beta 1 Welcomes New Fluent API and &quot;Where&quot;'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-6205375458709140472</id><published>2010-11-29T10:44:00.000-08:00</published><updated>2010-12-01T18:08:39.621-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ehcache example'/><title type='text'>Ehcache 2.4 Beta 1 Welcomes Search, Local Transactions and more...</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:Arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;div&gt;&lt;a href="http://terracotta.org/beta/"&gt;Ehcache 2.4 Beta has been released&lt;/a&gt;. We've been spending the last few years working hard to make Ehcache the best possible solution for users with caching needs. 2.4 beta 1 is another big step forward. The beta includes some significant new features and improvements that &lt;a href="http://docs.terracotta.org/confluence/display/release/Fremantle+Beta+Release+Notes"&gt;can be read about here&lt;/a&gt;. This blog is a few notes on getting started with those features and a few comments on why they are important.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ehcache Search&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This is one of the most requested features for Ehcache. I can't count how many times that I have had a map or cache and just wanted to quickly and easily search for an entry. Sure, one can write an iterator and use Java's matchers but that's &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;A bit of annoying coding&lt;/li&gt;&lt;li&gt;Only practical for unclustered caches&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Ehcache 2.4 Beta 1 has a new search interface in core Ehcache that works throughout our scale continuum. We used the "&lt;a href="http://en.wikipedia.org/wiki/Fluent_interface"&gt;Fluent Interface&lt;/a&gt;/&lt;a href="http://weblogs.java.net/blog/carcassi/archive/2010/02/04/building-fluent-api-internal-dsl-java"&gt;DSL&lt;/a&gt;" style that we've been moving towards over the &lt;a href="http://rifers.org/blogs/gbevin/2010/2/17/ehcache_cache_constructors"&gt;last couple of years&lt;/a&gt; in both Ehcache and &lt;a href="http://quartz-scheduler.org/"&gt;Quartz Scheduler&lt;/a&gt;. This style of interface makes an API easy to use and read like english. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To learn more about it check out this &lt;a href="https://github.com/sharrissf/Ehcache-Search-Sample/downloads"&gt;self contained sample app&lt;/a&gt; and &lt;a href="http://ehcache.org/documentation/search.html"&gt;the documenation&lt;/a&gt;. Give us feedback early and often on the &lt;a href="http://forums.terracotta.org/forums/forums/show/16.page"&gt;Ehcache Forums&lt;/a&gt; as the API is still under development and can still be improved.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Local Transactions&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Back in Ehcache 2.0 we added JTA support. This was helpful but we found that for some use-cases people wanted a few things.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Transactions without a JTA transaction manager&lt;/li&gt;&lt;li&gt;More speed&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;We improved the speed across the board of our XA compliant JTA stuff and we also added the concept of local transactions. Local transactions provide optimistic concurrency and atomicity across caches. They are like XA transactions but aren't completely tolerant of external resource crashes outside of Ehcache (i.e. cache + databases don't have all the guarantees of XA in the node failure cases. Does provide the guarantees across Ehcaches), don't require a transaction coordinator (though can be used with them) and tend to be less resource intensive (read faster). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've whipped up a &lt;a href="https://github.com/sharrissf/Ehcache-Local-Transaction-Sample/downloads"&gt;little self contained sample here.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Improved Enterprise Disk Store&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In 2.3 we added an Enterprise version of unclustered Ehcache core. The version added support for very large caches through the seamless&lt;a href="http://dsoguy.blogspot.com/2010/09/little-bit-about-bigmemory-for-ehcache.html"&gt; BigMemory&lt;/a&gt; add-on (1 line of config). We also, somewhat more quietly, added the beginnings of a new Enterprise disk store that no longer stored keys in memory and can handle larger restartable caches. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2.4 beta 1 takes this to another level. The disk store is now way more efficient, better leverages SSD drives and can efficiently grow to very large sizes without any additional heap usage or fragmenting. One can exercise the improvements using the&lt;a href="http://dsoguy.blogspot.com/2010/10/couple-minutes-with-ehcache-bigmemory.html"&gt; Ehcache Pounder&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Other Improvements&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;While not everything for the final release was done in time for Beta 1 some significant improvements are in. &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;NonStopCache now built in. Rather than have to add a jar and configure a wrapper to get the non-stop characteristics in clustered land this is now built into the product core and be turned on via configuration&lt;/li&gt;&lt;li&gt;Search now works clustered - The new search API is backed by the Terracotta tier. This is still early and we have a lot of performance and HA work to do here. That said, it is testable and usable so give it a try.&lt;/li&gt;&lt;li&gt;Explicit locking module is now in the core kit&lt;/li&gt;&lt;li&gt;Rejoin now works in non-stop (You can disconnect from a cluster and reconnect to that cluster without restarting)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For those interested in scheduling we have also released &lt;a href="http://www.quartz-scheduler.org/"&gt;Quartz Scheduler 2.0 beta 1&lt;/a&gt;. More stuff will be coming in a month or so when we do beta 2 for all products.  &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-6205375458709140472?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/6205375458709140472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=6205375458709140472' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6205375458709140472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6205375458709140472'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/11/ehcache-24-beta-1-welcomes-txs-search.html' title='Ehcache 2.4 Beta 1 Welcomes Search, Local Transactions and more...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-9096806143626641957</id><published>2010-11-15T09:46:00.000-08:00</published><updated>2010-11-15T16:12:32.615-08:00</updated><title type='text'>Direct Buffer Access Is Slow, Really?</title><content type='html'>&lt;div&gt;Lots of claims in the blog sphere around direct memory buffers being slow. &lt;a href="http://ehcache.org/documentation/offheap_store.html"&gt;We have been working with them a lot&lt;/a&gt; and hadn't seen that slowness but I'm more of a try it and see kinda guy so I did just that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I cooked up a quick single threaded test to compare offheap direct memory buffers to on heap byte buffers. What I found is that at least on my notebook direct is between 2-5 percent of onheap. Even on my notebook I was writing and reading 2G/second in small chunks to random parts of the byte buffer (Every operation on the test does one write and one read). &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The nice thing about them is they occupy no heap so the data stored in them is hidden away from the JVM GC. Of course whether that 2 to 5 percent matters depends on how much data your app is trying to crank through them so as always you need to look at your use-case's, latency, through-put and SLA goals and code accordingly.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While more testing can and should(and has) be done, here is a place for people to start.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's the code and my results from my 1.6 ghz notebook. I only spent a few minutes on it so suggestions to improve it are welcome:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;Type: ONHEAP Took: 8978 to write and read: 10737418368&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;Type: DIRECT Took: 9223 to write and read: 10737418368&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;Type: ONHEAP Took: 8827 to write and read: 10737418368&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;Type: DIRECT Took: 9283 to write and read: 10737418368&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;Type: ONHEAP Took: 8813 to write and read: 10737418368&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;Type: DIRECT Took: 9604 to write and read: 10737418368&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://gist.github.com/700690"&gt;https://gist.github.com/700690&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/700690.js"&gt; &lt;/script&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-9096806143626641957?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/9096806143626641957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=9096806143626641957' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/9096806143626641957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/9096806143626641957'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/11/offheap-access-is-slow-really.html' title='Direct Buffer Access Is Slow, Really?'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-7294170619881512256</id><published>2010-11-05T12:30:00.000-07:00</published><updated>2010-11-06T00:53:25.991-07:00</updated><title type='text'>A Couple Minutes With Ehcache Search...</title><content type='html'>&lt;div&gt;&lt;b&gt;Welcome To Ehcache Search&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Now that we are releasing our, GC Busting, &lt;a href="http://dsoguy.blogspot.com/2010/10/couple-minutes-with-ehcache-bigmemory.html"&gt;Ehache BigMemory&lt;/a&gt; product we are starting the process of gathering feedback on the new &lt;a href="http://ehcache.org/documentation/search.html"&gt;Ehcache Search API&lt;/a&gt;. While Ehcache Big Memory solves your &lt;a href="http://dsoguy.blogspot.com/2007/06/latency-v-throughput.html"&gt;Latency, through-put and SLA&lt;/a&gt; issues, Ehcache Search gives you the ability to handle a users data retrieval needs in a simple and efficient way.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;What is it?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;With todays &lt;a href="http://dsoguy.blogspot.com/2010/09/little-bit-about-bigmemory-for-ehcache.html"&gt;data explosion and hardware memory size explosion&lt;/a&gt;, in-memory and caching have become an important part of everyone's software. Now, getting at the data in that cache in a flexible, simple and fast way has really become an important area of focus. Things like finding entries that match criteria, performing aggregations and calculations (eg average, sum, max, min) need to be easy and efficient. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's where the new Ehcache Search API comes in. It will provide fast efficient searches and aggregations across the Ehcache Snap in, Speed up, Scale out continuum (Single node performance through scaled out architecture). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please try out the API (It's checked into Ehache core's trunk) by grabbing the this self contained, buildable sample and open source Ehcache nightly jar I've put up on GitHub.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://github.com/sharrissf/Ehcache-Search-Sample/downloads"&gt;https://github.com/sharrissf/Ehcache-Search-Sample/downloads&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's simple to use and 100 percent open source. We are very excited about feedback and plenty of time still exists for making changes and improvements. Please ask lots of questions and give lots of feedback.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To try it you can just unpack the kit:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;tar -xzvf ehcache-search-sample-0.0.1-SNAPSHOT-distribution.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and run it:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  sh run.sh&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:Georgia, serif;"&gt;&lt;div&gt;The source code is included in the kit and can be edited in this directory:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;src/main/java/org/sharrissf/sample/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;rebuilt if you have &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;mvn clean install&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;And rerun using the run.sh command.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;div style="font-family: Georgia, serif; "&gt;You can even package it up yourself by using &lt;/div&gt;&lt;div style="font-family: Georgia, serif; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;mvn clean assembly:assembly&lt;/div&gt;&lt;div style="font-family: Georgia, serif; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Georgia, serif; "&gt;Looking forward to hearing from the community. It will be interesting to see how projects like Grails, Hibernate, Liferay and Cold Fusion leverage cache search. Those uses will help set direction for years to come.&lt;/div&gt;&lt;div style="font-family: Georgia, serif; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-7294170619881512256?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/7294170619881512256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=7294170619881512256' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7294170619881512256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7294170619881512256'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/11/couple-minutes-with-ehcache-search.html' title='A Couple Minutes With Ehcache Search...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-7993812463794444963</id><published>2010-10-08T21:10:00.000-07:00</published><updated>2010-10-08T21:15:59.688-07:00</updated><title type='text'>Strange Talk On Ehcache BigMemory</title><content type='html'>I'll be giving a talk at Strange Loop On &lt;a href="http://strangeloop2010.com/talks/14480"&gt;"The Life And Times Of BigMemory."&lt;/a&gt; I'll put a link to the slides and the recording of the talk here when it's done. It's an excellent conference and I'm really looking forward to speaking there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-7993812463794444963?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/7993812463794444963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=7993812463794444963' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7993812463794444963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7993812463794444963'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/10/strange-talk-on-ehcache-bigmemory.html' title='Strange Talk On Ehcache BigMemory'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-7246662903926298777</id><published>2010-10-06T17:26:00.000-07:00</published><updated>2010-11-29T11:33:04.345-08:00</updated><title type='text'>A Couple Minutes With Ehcache BigMemory Pounder...</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UPDATE: This product was released (No longer in beta)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://dsoguy.blogspot.com/2010/09/little-bit-about-bigmemory-for-ehcache.html"&gt;Ehcache with BigMemory&lt;/a&gt; is now out in &lt;a href="http://www.terracotta.org/bigmemory?src=/index.html"&gt;beta&lt;/a&gt;.  One of the challenges when confronted with a new technology is exercising and understanding it's characteristics. Sure, you can read the &lt;a href="http://ehcache.org/documentation/offheap_store.html"&gt;docs&lt;/a&gt;, Google for some blogs, integrate it with your application and maybe write some samples, but that's a lot of work. Plus those approaches may not give you a clear picture of the various characteristics of the software. In order to make things a bit easier I've released a configurable pounder application for Standalone Ehcache with BigMemory. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Getting Installed&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are the steps to get started:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Get the &lt;a href="http://www.terracotta.org/bigmemory"&gt;Ehcache with BigMemory&lt;/a&gt; Beta and a license key to use it.&lt;/li&gt;&lt;li&gt;Get the &lt;a href="http://github.com/sharrissf/Ehcache-Standalone-Pounder/downloads"&gt;Standalone Ehcache Pounder distribution&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Unpack the Ehcache with BigMemory distribution&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;tar -xzvf ehcache-core-ee-2.3-distribution.tar.gz&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Copy the Standalone Ehcache Pounder kit into the ehcache kit and unpack it&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;cd ehcache-core-ee-2.3&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;cp ../ehcache-pounder-0.0.5-SNAPSHOT-distribution.tar.gz .&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;tar -xzvf ehcache-pounder-0.0.5-SNAPSHOT-distribution.tar.gz&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Copy your license file and your ehcache core jar into the pounder kit&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;cd ehcache-pounder-0.0.5-SNAPSHOT&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;cp ../lib/ehcache-core-ee-2.3.jar .&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;and copy terracotta-license.key to the ehcache-pounder-0.0.5-SNAPSHOT as well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Running the Pounder&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now you are ready to go. First take a look at the start script in one of the template directories (i.e. templates/1G-BigMemory):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;sh  &lt;/span&gt;run-pounder.sh&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Out of the box it looks like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;java -verbose:gc  -Xms200m -Xmx200m -XX:+UseCompressedOops -XX:MaxDirectMemorySize=64G -cp ".:./jyaml-1.3.jar:./ehcache-pounder-0.0.5-SNAPSHOT.jar:./ehcache-core-ee-2.3.jar:slf4j-api-1.5.11.jar:slf4j-jdk14-1.5.11.jar" org.sharrissf.ehcache.tools.EhcachePounder&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This should work fine for most people. It uses a small heap of 200 meg (you may need to grow this for really big caches). It is fine to have a MaxDirectMemorySize that is larger than your memory size on your machine. Just don't have a maxOffHeap size in your config.yml that is greater than your available physical memory on your machine. Also, make sure you leave room for your OS and the JVM. For example. If you have 8G of physical memory you might do a 400m java heap, a 6G offheap and leave the rest for the OS to use.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The script defaults to verbose gc because it's useful to see those stats and compressed oops BECAUSE YOU SHOULD BE USING A 64 BIT JVM and this setting makes it much more efficient (closer to 32 bit object pointers when possible using much less heap).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I tend to run this script like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;./run-pounder.sh | tee out.txt&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That way all output of the test goes to both the screen and to the file out.txt&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Configuring the Pounder&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You configure the pounder using the config.yml file. You can learn about all the options in the README. Here is the sample config included in the kit:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;storeType: OFFHEAP&lt;/div&gt;&lt;div&gt;threadCount: 33&lt;/div&gt;&lt;div&gt;entryCount: 1000000&lt;/div&gt;&lt;div&gt;offHeapSize: "1G"&lt;/div&gt;&lt;div&gt;maxOnHeapCount: 5000&lt;/div&gt;&lt;div&gt;batchCount: 50000&lt;/div&gt;&lt;div&gt;maxValueSize: 800&lt;/div&gt;&lt;div&gt;minValueSize: 200&lt;/div&gt;&lt;div&gt;hotSetPercentage: 99&lt;/div&gt;&lt;div&gt;rounds: 40&lt;/div&gt;&lt;div&gt;updatePercentage: 10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;diskStorePath: /export1/dev&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;NOTE: The most important setting here is the offHeapSize. If you set this to a number greater than the amount of memory you have on your machine you will not be happy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The offHeapSize + the heap size + the amount of memory your OS needs together must be less than the amount of physical available memory on the machine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Output&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;When running the output will look like the following:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; size:492120 time: 7434 Max batch time millis: warmup value size:796 READ: 0 WRITE: 15151 Hotset: 99&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;size = total size of cache&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;time = total time to execute batch&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;max batch time = either warm up for the load phase or the longest time it took to execute a batch (note that in a multi-threaded test on a cpu bound machine the batch times are going to be impacted.)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;value size = size of the value in this batch&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;READ = number of reads in the batch&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;WRITE = number  of writes in the batch&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;hotset = percentage of the time that reads are done from the on heap cache&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;At the end of each round you'll see something like this:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;div&gt;Took: 10899 final size was 995240 TPS: 91751 MAX GET TIME: 20&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Took = total time the round took&lt;/div&gt;&lt;div&gt;final size = the total size of the cache at the end (this can be impacted by eviction and be less than what you loaded)&lt;/div&gt;&lt;div&gt;TPS = total TPS during the run&lt;/div&gt;&lt;div&gt;MAX GET TIME = The  maximum amount of time it took to get an entry&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An interesting design choice of this pounder is that the threads you define do BOTH reading and writing. So the writers can starve out the readers in a hotset test. I could have gone he other way and then the readers could starve out the writers giving overly generous TPS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;What's Next&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The biggest gap right now is that I didn't implement a way to specify a rate. It always goes full throttle. I'll try to add that when I get some time if people think it's useful.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;Please give me lots of feedback so we can improve both the pounder and Ehcache&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"   style="  line-height: 17px; font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-size:12px;"&gt;Learn more at:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"   style="  line-height: 17px; font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-size:12px;"&gt;&lt;a href="http://github.com/sharrissf/Ehcache-Standalone-Pounder"&gt;The source for the pounder&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"   style="  line-height: 17px; font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-size:12px;"&gt;&lt;a href="http://github.com/sharrissf/Ehcache-Standalone-Pounder"&gt;http://terracotta.org/bigm&lt;/a&gt;&lt;a href="http://terracotta.org/bigmemory" style="color: rgb(187, 51, 0); "&gt;emory&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"   style="  line-height: 17px; font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-size:12px;"&gt;&lt;a href="http://dsoguy.blogspot.com/2010/09/little-bit-about-bigmemory-for-ehcache.html"&gt;My other blog on BigMemory&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ehcache.org/documentation/offheap_store.html" style="color: rgb(187, 51, 0); "&gt;Check the Ehcache BigMemory docs&lt;/a&gt;&lt;div&gt;&lt;a href="http://www.terracotta.org/confluence/display/release/BigMemory+for+the+Terracotta+Server+Array+-+FAQ" style="color: rgb(187, 51, 0); "&gt;Server Array BigMemory FAQ&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-7246662903926298777?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/7246662903926298777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=7246662903926298777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7246662903926298777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7246662903926298777'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/10/couple-minutes-with-ehcache-bigmemory.html' title='A Couple Minutes With Ehcache BigMemory Pounder...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-358707548684934115</id><published>2010-09-15T00:18:00.000-07:00</published><updated>2010-09-16T10:01:27.060-07:00</updated><title type='text'>A Little Bit About BigMemory for Ehcache and Terracotta ...</title><content type='html'>&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Big Memory?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In talking to our users it is clear that applications are getting more and more data hungry. According to IDC, data requirements are growing at an annual rate of 60 percent. This trend is driven further by cloud computing platforms, company consolidation and huge application platforms like Facebook. There is good news though. Server class machines purchased this year have a minimum of 8 Gig of RAM and likely have 32 Gig. Cisco is now selling mainstream UCS boxes with over 380 Gig of RAM (which I have tried and is amazing). On EC2 you can borrow 68.4 Gig machines for 2 dollars an hour (I have also tried this and it is also pretty amazing). Memory has gotten big and extremely cheap compared to things like developer time and user satisfaction.&lt;br /&gt;&lt;br /&gt;Unfortunately a problem exists as well. For Java/JVM applications it is becoming an ever increasing challenge to use all that data and memory. At the same time that the data / memory explosion is occurring the amount of heap a Java process can effectively use has stayed largely unchanged. This is due to the ever increasing Garbage Collection pauses that occur as a Java heap gets large. We see this issue at our customers but we also see here at Terracotta tuning our products and the products we use like third party app servers, bug tracking systems CMS's and the like. How many times have you heard "run lots of JVM's" or "don't grow the heap" from your vendor's and/or devs?&lt;br /&gt;&lt;br /&gt;So we set out to first identify the problem as it exists today, both in the wild and in-house. We then created a solution, first for us (an internal customer) and then for all of the millions of nodes of &lt;a href="http://www.ehcache.org/"&gt;Ehcache&lt;/a&gt; out there (all of you)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;3 Big Problems Seen by Java Applications&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My Application is too slow&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My application can't keep up with my users. I've got 10's of gigs of data in my database but it's over loaded and or too slow to service my needs. Either due to the complicated nature of my queriers or the volume of those queries. I want my data closer to the application so of course I start caching. Caching helps, but I want to cache more. My machine has 16 gigs of RAM but if I grow my heap that large, I get too many Java GC pauses.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My Application's latencies aren't predictable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On average my Java application is plenty fast but I see pauses that are unacceptable to my users. I can't meet my SLA's due to the size of my heap combined with Java GC pauses.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My software/deployment is too complicated&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've solved the Java GC problem. I run with many JVM's with heap sizes of 1-2 gigs. I partition my data and or loadbalance to get the performance and availability I need but my setup is complicated to manage because I need so many JVM's and I need to make sure the right data is in the right places. I fill up all 64 Gig's of RAM on my machine but it's too hard and fragile.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The other problem&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Like many vendors, in the past we told our users to keep the heaps down under 6 gig. This forced our customers to not completely leverage the memory and or cpu on the machines they purchased and or stack JVM's on a machine. The prior is expensive and inefficient and the latter fragile and complex.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is a quick picture of what people do with their Java Applications today:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Base Case&lt;/span&gt; - Small heap JVM on a big machine because GC pauses are a problem&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Big heap&lt;/span&gt; - That has long GC's that are complicated to manage&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Stacked small JVM heaps &lt;/span&gt;- This in combination with various sharding, load balancing and clustering techniques is often used. This is complicated to manage and if all the nodes GC at the same time this can lead to availability problems.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_rOeRnnmMxi0/TJDnkiHp1SI/AAAAAAAAACU/otYJwC3Uk5I/s1600/JVM+on+todays+hardware.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 286px; height: 320px;" src="http://2.bp.blogspot.com/_rOeRnnmMxi0/TJDnkiHp1SI/AAAAAAAAACU/otYJwC3Uk5I/s320/JVM+on+todays+hardware.jpg" alt="" id="BLOGGER_PHOTO_ID_5517164158349071650" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;What kind of solution would help?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's what we believe are the requirements for a stand-alone caching solution that attacks the above problems.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Hold a large dataset in memory without impacting GC (10s-100s of Gig) - The more data that is cached the less you have to go to your external data source and or disk the faster the app goes&lt;/li&gt;&lt;li&gt;Be Fast - needs to meet the SLA&lt;/li&gt;&lt;li&gt;Stay Fast - Don't fragment, don't slowdown as the data is changed over time&lt;/li&gt;&lt;li&gt;Concurrent - Scales with cpu and threads. No lock contention&lt;/li&gt;&lt;li&gt;Predictable - can't have pauses if I want to make my SLA&lt;/li&gt;&lt;li&gt;Needs to be 100 percent Java, work on your JVM on your OS&lt;/li&gt;&lt;li&gt;Restartable - A big cache like this needs to be restartable because it takes too long to build&lt;/li&gt;&lt;li&gt;Should just Snap-in and work - not a lot of complexity&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;What have we built?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First we built a core piece of technology, &lt;a href="http://www.terracotta.org/bigmemory"&gt;BigMemory&lt;/a&gt;, an off-heap, direct memory buffer store, with a highly optimized memory manager that meets and or exceeds requirements 1-6 above. This piece of technology is currently being applied in two ways:&lt;br /&gt;&lt;br /&gt;1) &lt;span style="font-weight: bold;"&gt;Terracotta Server Array&lt;/span&gt; - We sold it to our built-in customer, the &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; Server Team, who can now create individual nodes of our L2 caches that can hold a hundred million entries, leverage 10's of gigs of memory, pause free and with linear TPS. This leverages entire machines (even big ones) with a single JVM for higher availability, a simpler deployment model, 8x improved density and rock steady latencies.&lt;br /&gt;&lt;br /&gt;2) &lt;span style="font-weight: bold;"&gt;Ehcache&lt;/span&gt; - We've added BigMemory and a new disk store to Enterprise Ehcache to create a new tiered store adding in requirements 7-8 from above (snap-in simplicity and restart-ability). The Ehcache world at large can benefit from this store just as much as the Terracotta products do.&lt;br /&gt;&lt;br /&gt;Check out the diagram below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_rOeRnnmMxi0/TJDogfqvY1I/AAAAAAAAACc/evZ2TTPNVLs/s1600/tiered_storage.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 158px;" src="http://3.bp.blogspot.com/_rOeRnnmMxi0/TJDogfqvY1I/AAAAAAAAACc/evZ2TTPNVLs/s320/tiered_storage.png" alt="" id="BLOGGER_PHOTO_ID_5517165188483081042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Typically, using either of the BigMemory backed products, you shrink your heap and grow your cache. By doing so SLA's are easier to meet because GC pauses pretty much go away and you are able to keep a huge chunk of data in memory.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Summing up&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Memory is cheap and growing. Data is important and growing just as fast. Java's GC pauses are preventing applications from keeping up with your hardware. So do what every other layer of your software and hardware stack does: cache. But in Java, the large heaps needed to hold your cache can hurt performance due to GC pauses. So use a tiered cache with BigMemory that leverages your whole machine and keeps your data as close to where it is needed as possible. That's what Terracotta is doing for it's products. Do so simply, i.e. snap it in to Ehcache and have large caches without the pauses caused by GC. As a result create a simpler architecture with improved performance/density and better SLA's.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Learn more at &lt;a href="http://terracotta.org/bigmemory"&gt;http://terracotta.org/bigmemory&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ehcache.org/documentation/offheap_store.html"&gt;Check the Ehcache BigMemory docs&lt;/a&gt; &lt;div&gt;&lt;a href="http://www.terracotta.org/confluence/display/release/BigMemory+for+the+Terracotta+Server+Array+-+FAQ"&gt;Server Array BigMemory FAQ &lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-358707548684934115?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/358707548684934115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=358707548684934115' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/358707548684934115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/358707548684934115'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/09/little-bit-about-bigmemory-for-ehcache.html' title='A Little Bit About BigMemory for Ehcache and Terracotta ...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_rOeRnnmMxi0/TJDnkiHp1SI/AAAAAAAAACU/otYJwC3Uk5I/s72-c/JVM+on+todays+hardware.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-6323996440663078544</id><published>2010-07-28T07:29:00.000-07:00</published><updated>2010-11-10T11:27:35.373-08:00</updated><title type='text'>Application Scale and Quartz "Where"</title><content type='html'>I don't think it is to controversial to say that &lt;a href="http://quartz-scheduler.org/"&gt;Quartz Scheduler&lt;/a&gt; is by far the dominant Open-Source Java job scheduler. It provides fast, flexible, and extremely reliable job execution and it is embedded in just about everything out there. In the last 6 months or so we have added a new &lt;a href="http://terracotta.org/quartz/"&gt;Terracotta&lt;/a&gt; backed version of Quartz, lots of bug fixes and a GUI for monitoring quartz when clustered with Terracotta. We have a lot more coming. The team is hard at work on what's next. My favorite feature on the Quartz 2.0 list, the one they are working on right now, is Job Location Control or what is code named "Where".&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some of the trends we are seeing in our user base include the leveraging of EC2, larger apps/user bases, demanding HA requirements and hardware farms. As a result, scaled-out architectures are becoming common place in many IT environments. Scheduling work in these large multi-node environments is becoming a part of many software developers lives. Currently, Quartz supports scale-out but with little control over how the work is distributed. While this is a good start one quickly runs into problems like assigning jobs to machines that have the processing power to the work on them at the time the job is fired. Or execute the job where the data is local. Or just perform certain jobs on certain classes of machines do to their location or by purpose.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well that is "where" we are headed. In the next few months the Quartz guys working with the Terracotta Guys and the &lt;a href="http://www.ehcache.org/"&gt;Ehcache&lt;/a&gt; guys are developing a solution to the above set of problems. We'll be giving the same flexible and reliable scaled out scheduler but adding a new level of control. We are adding the "Where"&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Stay tuned...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-6323996440663078544?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/6323996440663078544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=6323996440663078544' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6323996440663078544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6323996440663078544'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/07/quartz-scheduler-heading-for-20-and.html' title='Application Scale and Quartz &quot;Where&quot;'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-8720774704780935850</id><published>2010-07-22T08:40:00.000-07:00</published><updated>2010-07-22T08:47:55.924-07:00</updated><title type='text'>Hiring at Terracotta - Performance/Testing Engineer and or Lead</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 12px; line-height: 17px; "&gt;&lt;div&gt;Working at Terracotta is just about the best job someone could want (my humble opinion). Fast paced, super smart people, lots of interesting problems and widely adopted products wrapped up in a nice little package known as a fast growing startup. So send your resume now!&lt;/div&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 12px; line-height: 17px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 12px; line-height: 17px; "&gt;These positions can be either in San Francisco or Noida India.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 12px; line-height: 17px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; font-size: 12px; line-height: 17px; "&gt;&lt;div&gt;&lt;div&gt;About Terracotta:&lt;/div&gt;&lt;div&gt;Terracotta is the a fast growing company behind the most widely used software for application scalability, availability and performance. Our software is deployed in more than 250,000 enterprise installations, including the majority of the Fortune 2000.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Snap-in Scale and Performance&lt;/div&gt;&lt;div&gt;Terracotta's software products provide snap-in performance and scale for enterprise applications. With a simple change in two lines of configuration, Terracotta customers can run enterprise applications 10x faster and scale them―from one node, to 1000s, even to the cloud―without re-writing code or compromising performance or reliability.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A Leader in Distributed Caching&lt;/div&gt;&lt;div&gt;In “The Forrester Wave™: Elastic Caching Platforms, Q2 2010,” Forrester named Terracotta a Leader in this emerging market and ranked us strongest in strategy among eight elastic caching platforms.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://www.terracotta.org&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Where we are:&lt;/div&gt;&lt;div&gt;Our main headquarters are in San Francisco, CA in the SOMA area. We have an office in Noida, India and we have super star developers all over the world.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Description for LEAD QA Engineer&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At Terracotta quality and stability in our product are our primary&lt;/div&gt;&lt;div&gt;objectives. Join our highly motivated, fast paced, agile, quality driven development team&lt;/div&gt;&lt;div&gt;where you will have many great  opportunities to make an impact on&lt;/div&gt;&lt;div&gt;product capabilities and success in your role as QA Lead.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a valued member of our tech lead team you will:&lt;/div&gt;&lt;div&gt;* Develop, maintain, and enhance both unit testing and performance&lt;/div&gt;&lt;div&gt;testing frameworks&lt;/div&gt;&lt;div&gt;* Design test strategies, develop test tools and implement test cases to&lt;/div&gt;&lt;div&gt;ensure highest quality deliverables for maintenace and new feature releases&lt;/div&gt;&lt;div&gt;* Improve the overall productivity of all of your co-workers by&lt;/div&gt;&lt;div&gt;identifying tools and processes to increase overall efficiency&lt;/div&gt;&lt;div&gt;* Create and maintain functional, performance, stress and endurance tests&lt;/div&gt;&lt;div&gt;* Diagnose and debug issues in a production environment&lt;/div&gt;&lt;div&gt;* Work closely with Engineering to understand the Product Architecture&lt;/div&gt;&lt;div&gt;and work on identifying, designing or enhancing existing test frameworks&lt;/div&gt;&lt;div&gt;to support backend test development&lt;/div&gt;&lt;div&gt;* Mentor and manage QA Engineers in a distributed team&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Qualifications&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;* Proven track record as a lead in development and/or QA&lt;/div&gt;&lt;div&gt;* Motivated to improve existing processes, test strategies&lt;/div&gt;&lt;div&gt;* Strong knowledge of Java or other related programming languages&lt;/div&gt;&lt;div&gt;* Strong Knowledge in at least one scripting language such as Perl or Ruby&lt;/div&gt;&lt;div&gt;* Experience in creating back end test frameworks&lt;/div&gt;&lt;div&gt;* Ability to work independently to triage issues and prioritize tasks&lt;/div&gt;&lt;div&gt;* Strong understanding of QA Process&lt;/div&gt;&lt;div&gt;* Strong communication skills (verbal and written)&lt;/div&gt;&lt;div&gt;* Experience with code coverage and test tool development&lt;/div&gt;&lt;div&gt;* Experience with UNIX&lt;/div&gt;&lt;div&gt;* Experience with distributed caches, high availability  products, and/or NoSQL solutions&lt;/div&gt;&lt;div&gt;* Experience with common java frameworks and containers such as Spring, Jetty, Hibernate, Ehcache, Quartz&lt;/div&gt;&lt;div&gt;* Ability to focus on multiple projects while in differing SDLC phases&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If that's you and you meet most of the below criteria send us your resume careers@terracottatech.com.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-8720774704780935850?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/8720774704780935850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=8720774704780935850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8720774704780935850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8720774704780935850'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/07/hiring-at-terracotta-performancetesting.html' title='Hiring at Terracotta - Performance/Testing Engineer and or Lead'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-7064065828025156603</id><published>2010-07-20T18:48:00.000-07:00</published><updated>2010-07-21T00:20:35.067-07:00</updated><title type='text'>Hiring at Terracotta...</title><content type='html'>&lt;div&gt;Working at Terracotta is just about the best job someone could want (my humble opinion). Fast paced, super smart people, lots of interesting problems and widely adopted products wrapped up in a nice little package known as a fast growing startup. So send your resume now!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;About Terracotta:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Terracotta is the a fast growing company behind the most widely used software for application scalability, availability and performance. Our software is deployed in more than 250,000 enterprise installations, including the majority of the Fortune 2000.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Snap-in Scale and Performance&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Terracotta's software products provide snap-in performance and scale for enterprise applications. With a simple change in two lines of configuration, Terracotta customers can run enterprise applications 10x faster and scale them―from one node, to 1000s, even to the cloud―without re-writing code or compromising performance or reliability.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;A Leader in Distributed Caching&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In “The Forrester Wave™: Elastic Caching Platforms, Q2 2010,” Forrester named Terracotta a Leader in this emerging market and ranked us strongest in strategy among eight elastic caching platforms.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.terracotta.org/"&gt;http://www.terracotta.org&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Where we are:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Our main headquarters are in San Francisco, CA in the SOMA area. We have super star developers all over the world.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Who we are looking for:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have you written or worked on a distributed system, messaging system or NoSQL solution? Do you love cool, hard problems? Are you good at design API's that work well in todays Java Applications? Can you work both in a group and on your own?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Qualifications:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Works hard and solves hard problems&lt;/li&gt;&lt;li&gt;Strong OO/Framework design sense&lt;/li&gt;&lt;li&gt;Understand the Java Landscape in a deep way (i.e. Spring, J2EE, &lt;a href="http://www.ehcache.org/"&gt;Ehcache&lt;/a&gt;, &lt;a href="http://www.quartz-scheduler.org/"&gt;Quartz&lt;/a&gt;, Rest, SOAP, NoSQL)&lt;/li&gt;&lt;li&gt;Excited about performance, caching and scale-out&lt;/li&gt;&lt;li&gt;Love to code and write tests&lt;/li&gt;&lt;li&gt;Works well in a team and individually&lt;/li&gt;&lt;li&gt;Believes that the only way to know if something works is to test it in a repeatable way&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Nice to have:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Experience with open-source&lt;/li&gt;&lt;li&gt;Live in/near San Francisco&lt;/li&gt;&lt;li&gt;Tech Lead experience&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Responsibilities:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Design and build the next generation of scale-out, performance and HA software.&lt;/li&gt;&lt;li&gt;Contribute to and extend Terracotta, Ehcache and/or Quartz Scheduler, some of the most popular and widely used frameworks in Java&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;If that's you and you meet most of the below criteria send us your resume careers@terracottatech.com.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-7064065828025156603?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/7064065828025156603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=7064065828025156603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7064065828025156603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7064065828025156603'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/07/hiring-at-terracotta.html' title='Hiring at Terracotta...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-3670794908420425051</id><published>2010-06-24T14:42:00.000-07:00</published><updated>2010-07-20T19:18:18.979-07:00</updated><title type='text'>A Couple Minutes With Some Toolkit Samples</title><content type='html'>&lt;div&gt;Last night we released Beta 2 of the Terracotta 3.3 release. It has a number of improvements and updates to the &lt;a href="http://dsoguy.blogspot.com/2010/04/countdown-to-terracotta-toolkit-beta.html"&gt;Terracotta Toolkit &lt;/a&gt; including improved naming and factoring and additional clustered classes like AtomicLong and List. You can grab that or to get the absolute latest you can grab a nightly (my preference because the beta doesn't work with maven)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I pushed a couple of toolkit samples to &lt;a href="http://GitHub.com/"&gt;GitHub&lt;/a&gt; (which by the way is awesome!). I didn't do hardly any cleanup or comments so just post questions to the blog if you need help.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://github.com/sharrissf/Terracotta-Tools-and-Samples/"&gt;http://github.com/sharrissf/Terracotta-Tools-and-Samples/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If your a Git user already I don't need to tell you how to check it out. If your not just hit "download source" on the upper right of the web page and don't worry about Git.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Four examples are included:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;PlayingWithMapOfLocksExpress&lt;/b&gt; - A quick sample that show's how to create a clustered Map of Locks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;PlayingWithToolkitBarrier&lt;/b&gt; - Example of using a Cyclic barrier to coordinate between processes&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;PlayingWithToolkitClusterInfo&lt;/b&gt; - Example showing how to register a listener for cluster events.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;PlayingWithToolkitQueue&lt;/b&gt; - Little sample on using a queue between two nodes &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;PlayingWithToolkitClusterCounter&lt;/b&gt;  - Basic sample that show's using a clustered atomic long&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can run these from the command line by:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Downloading and unpacking the &lt;a href="http://www.terracotta.org/dl/?src=/index.html"&gt;nightly build&lt;/a&gt; or &lt;a href="http://www.terracotta.org/beta/esperance-beta?src=2010-06-08-esperance-beta-badge"&gt;beta&lt;/a&gt; from Terracotta&lt;/li&gt;&lt;li&gt;Staring the Terracotta server by calling the ./bin/start-tc-server.sh&lt;/li&gt;&lt;li&gt;Running 2 instances of the compiled versions of any of the above&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;java -cp target:INSTALL_DIR/common/terracotta-toolkit-1.0-runtime-ee-1.0.0-SNAPSHOT.jar PlayingWithToolkitClusterInfo&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can also run them using the &lt;a href="http://www.terracotta.org/confluence/display/wiki/Terracotta+Maven+Plugin#TerracottaMavenPlugin-Configuration"&gt;Terracotta Maven Plugin&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;mvn tc:run&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To switch between the samples edit the pom.xml&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-3670794908420425051?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/3670794908420425051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=3670794908420425051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3670794908420425051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3670794908420425051'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/06/couple-minutes-with-some-toolkit.html' title='A Couple Minutes With Some Toolkit Samples'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-152064412822613572</id><published>2010-06-09T12:49:00.000-07:00</published><updated>2010-06-18T13:42:19.547-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='terracotta'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed cache'/><category scheme='http://www.blogger.com/atom/ns#' term='ehcache'/><category scheme='http://www.blogger.com/atom/ns#' term='quartz scheduler'/><title type='text'>A Couple Minutes With The Terracotta 3.3 Beta</title><content type='html'>With &lt;a href="http://www.terracotta.org/beta/esperance-beta?src=2010-06-08-esperance-beta-badge"&gt;Terracotta platform version 3.3&lt;/a&gt; our goal of creating an accessible application performance and scale-out solution is taking another big step forward. It's important to us that developers can find success using the ubiquitous &lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt; for performance, &lt;a href="http://www.terracotta.org/ehcache/distributed-cache/ehcache-ex-hibernate?src=/index.html"&gt;Hibernate&lt;/a&gt; for an ORM,&lt;a href="http://www.terracotta.org/web-sessions/?was-expanded=ehcache-submenu"&gt; Http Web Sessions&lt;/a&gt; for user state and &lt;a href="http://www.terracotta.org/quartz/"&gt;Quartz&lt;/a&gt; for scheduling in a single node application. Then, &lt;a href="http://dsoguy.blogspot.com/2010/04/clustered.html"&gt;without much thought or effort&lt;/a&gt;, add a couple lines of config to achieve scale-out and HA serving needs all the way through enterprise apps and into the cloud. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have focused on a couple of high level areas in this release to take our solution to the next level. &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Simple Scale&lt;/b&gt; - Reduce the need for tuning and tweaking with an improved next gen datastore. It will allow the everyday user to achieve the kinds of scale needed for massive applications both in data size and number of nodes.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Improved Visibility&lt;/b&gt; - We have added panels for Quartz and Sessions to our developer console giving full visibility to the full suite of performance and scale-out products. We have also added a more product focused organization of information in the tool.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Simple HA&lt;/b&gt; - A new panel that makes it easier to monitor interesting events that occur in a cluster. Pre-built templates for various configurations. Simplified way of migrating nodes, better defaults.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dsoguy.blogspot.com/2010/05/couple-minutes-with-terracotta-toolkit.html"&gt;&lt;b&gt;Modularity&lt;/b&gt;&lt;/a&gt; - We have exposed some of our most powerful pieces and parts as a versioned standard API that can be simply coded against to get things like, locking, queuing, maps and cluster topology. We use this API to build all four of our core products (Ehcache, Quartz, Hibernate 2nd level cache, Web Sessions).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;While not everything made into the beta, enough is there to get a taste of where we are going. I encourage people to download it and try it as soon as possible. GA is just around the corner. Learn more on the&lt;a href="http://www.terracotta.org/confluence/display/docs/3.3.0+Beta+Release+Notes"&gt; release notes page.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-152064412822613572?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/152064412822613572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=152064412822613572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/152064412822613572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/152064412822613572'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/06/couple-minutes-with-terracotta-33-beta.html' title='A Couple Minutes With The Terracotta 3.3 Beta'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2474950803501883220</id><published>2010-05-18T13:12:00.000-07:00</published><updated>2010-05-18T13:57:35.003-07:00</updated><title type='text'>Steve Jobs Stanford Commencement</title><content type='html'>Was reading a couple stories on the web this morning and I ran into two somewhat interesting lists over at Time &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Magazine&lt;/span&gt;. I kinda mocked the first one upon reading the title "&lt;a href="http://www.time.com/time/specials/packages/article/0,28804,1988080_1988093_1988082,00.html"&gt;Top 10 College Dropouts&lt;/a&gt;." I laughed and said to my &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;Coworker&lt;/span&gt; and friend Orion, "Must be a slow news day!" Followed by spending the next 10 or 15 minutes &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;dissecting&lt;/span&gt; the article. How many were either from or lived in California? how many dropped out of Harvard? Who the heck is Buckminster Fuller? "About 10 minutes in Orion rightly pointed out, "Article can't be too bad since you've spent the last 10 minutes talking about it." Of course he was right.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Followed that up by clicking a link taking me to the next list called "&lt;a href="http://www.time.com/time/specials/packages/article/0,28804,1898670_1898671_1898643,00.html"&gt;Top 10 Commencement Speeches&lt;/a&gt;." I know what your thinking now, "How much free time does this guy have?" I was enjoying a little candy after a hard working morning ;-).  Anyway, I digress. I noticed that one of the names was on both lists. You guessed it, Steve Jobs,  someone that anyone who has ever built anything of any kind should at least respect.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I set about to watch the commencement speech he gave in 2005. He basically tells 3 stories from his life experience. Much like &lt;a href="http://video.google.com/videoplay?docid=-5700431505846055184#"&gt;Randy Pausch's last lecture&lt;/a&gt; their is a lot to be learned here. The first two stories are awesome and inspirational and many of us can relate to and learn from them. The third is also good/inspirational but a bit dark and kind of scary and depressing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, since in this speech Steve talks so much about time, I will lead in with the opinion that listening to this commencement is time well spent. &lt;a href="http://www.time.com/time/specials/packages/article/0,28804,1898670_1898671_1898644,00.html"&gt;Check it out&lt;/a&gt;!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2474950803501883220?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2474950803501883220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2474950803501883220' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2474950803501883220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2474950803501883220'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/05/steves-stanford-commencement.html' title='Steve Jobs Stanford Commencement'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4687760844642027014</id><published>2010-05-07T13:57:00.001-07:00</published><updated>2010-05-30T18:17:03.320-07:00</updated><title type='text'>A Couple Minutes With Non-Stop Ehcache</title><content type='html'>&lt;span&gt;&lt;span&gt;&lt;div&gt;Sometimes you just want to have an SLA (Service Level Agreement) when dealing with a component like a cache.  You want to know that no matter what goes wrong, disk failures, deadlocks, network down, database locked up (for write-through) your threads won't  be blocked for longer than your SLA. In the security world this is analogous to &lt;a href="http://en.wikipedia.org/wiki/Layered_security"&gt;Layered Security &lt;/a&gt;where one is protected at multiple layers from breaches. In this case you are protected at multiple  layers from hangs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Non-Stop Ehcache&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In comes &lt;a href="http://www.ehcache.org/documentation/non_stop_cache.html"&gt;NonStopCache&lt;/a&gt;. This is a decorator for &lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt; that allows one to specify an SLA. When using this decorator no operation is allowed to take longer than the SLA provided. All operations are isolated from the cache via a thread pool providing complete protection. The NonStopCache has multiple ways of configuring it. One can setup whether to serve stale data, perform noops or throw exceptions when SLA's are being violated covering most of the cases one needs.&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Getting Started&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's what I did to get started using  clustered Ehcache and NonStopCache:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Download &lt;a href="http://sourceforge.net/projects/ehcache/"&gt;Ehcache 2.1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Download the &lt;a href="http://sourceforge.net/projects/ehcache/"&gt;NonStopCache 1.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Start the Terracotta server&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;		ehcache-2.1.0-beta/terracotta/bin&lt;/span&gt;/start-tc-server.sh&lt;/div&gt;&lt;ul&gt;&lt;li&gt;run the below program (source code below)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;	&lt;/span&gt;java -cp .:ehcache-core-2.1.0-beta.jar:slf4j-api-1.5.8.jar:slf4j-jdk14-1.5.8.jar:ehcache-terracotta-2.1.0-beta.jar:ehcache-nonstopcache-1.0.0-beta.jar  MyFirstNonStopEhcacheSample&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;b&gt;NOTE: &lt;/b&gt;Kill the Terracotta server when the printed output instructs you too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's review the output:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Regular cache. No Decorator&lt;br /&gt;The size of the cache is: 0&lt;br /&gt;After put the size is: 1&lt;br /&gt;Here are the keys:&lt;br /&gt;	Key:0&lt;br /&gt;Done with cache.&lt;br /&gt;&lt;br /&gt;Sleeping, Stop your server&lt;br /&gt;Disconnected NonStop with noop cache.&lt;br /&gt;The size of the cache is: 0&lt;br /&gt;After put the size is: 0&lt;br /&gt;Here are the keys:&lt;br /&gt;Done with cache.&lt;br /&gt;&lt;br /&gt;Disconnected NonStop with local reads cache.&lt;br /&gt;The size of the cache is: 1&lt;br /&gt;After put the size is: 1&lt;br /&gt;Here are the keys:&lt;br /&gt;	Key:0&lt;br /&gt;Done with cache.&lt;br /&gt;&lt;br /&gt;Disconnected NonStop with exception cache.&lt;br /&gt;Exception in thread "main" net.sf.ehcache.constructs.nonstop.NonStopCacheException: getKeys timed out&lt;br /&gt;	at net.sf.ehcache.constructs.nonstop.behavior.ExceptionOnTimeoutBehavior.getKeys(ExceptionOnTimeoutBehavior.java:114)&lt;br /&gt;	at net.sf.ehcache.constructs.nonstop.behavior.ClusterOfflineBehavior.getKeys(ClusterOfflineBehavior.java:120)&lt;br /&gt;	at net.sf.ehcache.constructs.nonstop.NonStopCache.getKeys(NonStopCache.java:264)&lt;br /&gt;	at MyFirstNonStopEhcacheSample.addToCacheAndPrint(MyFirstNonStopEhcacheSample.java:45)&lt;br /&gt;	at MyFirstNonStopEhcacheSample.&lt;init&gt;(MyFirstNonStopEhcacheSample.java:40)&lt;br /&gt;	at MyFirstNonStopEhcacheSample.main(MyFirstNonStopEhcacheSample.java:60) &lt;/init&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;init&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;What Just Happened?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The cache is first loaded into an ordinary undecorated cache. This is performed before the server kill and proceeds without incident. The next round of operations on the cache were performed with the server down. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since that cache is configured as noop all operations are ignored and the size of the cache appears as zero. This is great for when you just want to not bother with the caching if it isn't available.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next round is local reads. This allows you to use the values that are available locally while the cache is unavailable. This is especially nice for read only or mostly read only caches that fit in memory and are always available.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After that we go to the exception version. If you have a cache of important coherent data but you don't want threads blocked this setting is for you. It will blow cache operations out of the thread so your container can just keep going by either showing an error page or getting the data from elsewhere. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some interesting points here:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;These decorators are all being used on the same cache.  This way you can make the behavior specific to the user of the cache. It gives tremendous flexibility.&lt;/li&gt;&lt;li&gt;You'll notice this little sample flies through despite the timeout being set to 13 seconds. This is because it's in fail fast mode. In this configurable mode if the cache knows it can't communicate it will return the failure case immediately. If that's not what you want you can instead set it up to not fail fast and wait the full timeout no matter what.&lt;/li&gt;&lt;li&gt;I did this work in config but the same setup can be done in code&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;The Code&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MyFirstNonStopEhcacheSample.java&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: java"&gt;&lt;![CDATA[ &lt;br /&gt;import net.sf.ehcache.CacheManager;&lt;br /&gt;import net.sf.ehcache.Ehcache;&lt;br /&gt;import net.sf.ehcache.Element;&lt;br /&gt;&lt;br /&gt;public class MyFirstNonStopEhcacheSample {&lt;br /&gt;	CacheManager cacheManager = new CacheManager("src/ehcachenonstop.xml");&lt;br /&gt;&lt;br /&gt;	public MyFirstNonStopEhcacheSample() {&lt;br /&gt;&lt;br /&gt;		// Get the same cache 4 times:&lt;br /&gt;		// First undecorated,&lt;br /&gt;		// Second decorated for noop&lt;br /&gt;		// Third decorated for localReads&lt;br /&gt;		// Fourth decorated for exception on timeout&lt;br /&gt;&lt;br /&gt;		Ehcache regularCache = cacheManager.getEhcache("testCache");&lt;br /&gt;		Ehcache noopCache = cacheManager.getEhcache("nonstopNoop");&lt;br /&gt;		Ehcache localReadsCache = cacheManager.getEhcache("nonstopLocalReads");&lt;br /&gt;		Ehcache exceptionCache = cacheManager.getEhcache("nonstopException");&lt;br /&gt;&lt;br /&gt;		// Undecorated, will succeed and adding an entry to the cache&lt;br /&gt;		System.out.println("");&lt;br /&gt;		System.out.println("Regular cache. No Decorator");&lt;br /&gt;		addToCacheAndPrint(regularCache);&lt;br /&gt;		try {&lt;br /&gt;			System.out.println("Sleeping, Stop your server");&lt;br /&gt;			Thread.sleep(10000);&lt;br /&gt;		} catch (InterruptedException e) {&lt;br /&gt;			e.printStackTrace();&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		System.out.println("Disconnected NonStop with noop cache.");&lt;br /&gt;		addToCacheAndPrint(noopCache);&lt;br /&gt;&lt;br /&gt;		System.out.println("Disconnected NonStop with local reads cache.");&lt;br /&gt;		addToCacheAndPrint(localReadsCache);&lt;br /&gt;&lt;br /&gt;		System.out.println("Disconnected NonStop with exception cache.");&lt;br /&gt;		addToCacheAndPrint(exceptionCache);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	private void addToCacheAndPrint(Ehcache cache) {&lt;br /&gt;&lt;br /&gt;		int cacheSize = cache.getKeys().size();&lt;br /&gt;		System.out.println("The size of the cache is: "&lt;br /&gt;				+ cache.getKeys().size());&lt;br /&gt;&lt;br /&gt;		cache.put(new Element("" + cacheSize, cacheSize));&lt;br /&gt;		System.out.println("After put the size is: " + cache.getKeys().size());&lt;br /&gt;		System.out.println("Here are the keys:");&lt;br /&gt;		for (Object key : cache.getKeys()) {&lt;br /&gt;			System.out.println("	Key:" + key);&lt;br /&gt;		}&lt;br /&gt;		System.out.println("Done with cache.");&lt;br /&gt;		System.out.println("");&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	public static void main(String[] args) throws Exception {&lt;br /&gt;		new MyFirstNonStopEhcacheSample();&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt; ]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And the Config file ehcachenonstop.xml:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: xml"&gt;&lt;![CDATA[  &lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;br /&gt;&lt;ehcache xsi="http://www.w3.org/2001/XMLSchema-instance" nonamespaceschemalocation="ehcache.xsd"&gt;&lt;br /&gt;&lt;br /&gt; &lt;terracottaConfig url="localhost:9510"&gt;&lt;br /&gt;&lt;br /&gt; &lt;defaultCache/&gt;&lt;br /&gt;&lt;br /&gt; &lt;cache name="testCache" eternal="true"&gt;&lt;br /&gt;  &lt;terracotta clustered="true"&gt;&lt;br /&gt;  &lt;cacheDecoratorFactory class="net.sf.ehcache.constructs.nonstop.NonStopCacheDecoratorFactory" properties="name=nonstopNoop, timeoutMillis=13000, timeoutBehavior=noop"&gt;&lt;br /&gt;  &lt;cacheDecoratorFactory class="net.sf.ehcache.constructs.nonstop.NonStopCacheDecoratorFactory" properties="name=nonstopException, timeoutMillis=13000, timeoutBehavior=exception"&gt;&lt;br /&gt;  &lt;cacheDecoratorFactory class="net.sf.ehcache.constructs.nonstop.NonStopCacheDecoratorFactory" properties="name=nonstopLocalReads, timeoutMillis=13000, timeoutBehavior=localReads"&gt;&lt;br /&gt; &lt;/cache&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ehcache&gt;&lt;br /&gt;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/init&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4687760844642027014?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4687760844642027014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4687760844642027014' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4687760844642027014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4687760844642027014'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/05/couple-minutes-with-non-stop-ehcache_07.html' title='A Couple Minutes With Non-Stop Ehcache'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4466138331276095037</id><published>2010-05-01T08:44:00.000-07:00</published><updated>2010-06-17T13:38:12.581-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed cache'/><category scheme='http://www.blogger.com/atom/ns#' term='ehcache'/><title type='text'>A Couple Minutes With Terracotta Toolkit Nightly</title><content type='html'>&lt;span class="Apple-style-span"   style="  ;font-family:Arial;font-size:medium;"&gt;&lt;div&gt;A couple days ago I wrote a short blog about our goal of creating a &lt;a href="http://dsoguy.blogspot.com/2010/04/countdown-to-terracotta-toolkit-beta.html"&gt;Terracotta Toolkit&lt;/a&gt; for others to easily build simple to use scaled out frameworks, tools and in some cases apps. This same exact toolkit is used to build &lt;a href="http://ehcache.org/" style="color: rgb(204, 102, 51); "&gt;Ehcache&lt;/a&gt;, &lt;a href="http://www.terracotta.org/start/start-hibernate"&gt;Hibernate&lt;/a&gt;, &lt;a href="http://www.terracotta.org/start/start-web-sessions?was-expanded=start-hibernate-submenu"&gt;Http Sessions&lt;/a&gt; and &lt;a href="http://www.terracotta.org/start/start-quartz?was-expanded=web-sessions-submenu"&gt;Quartz&lt;/a&gt; with Scale and HA &lt;a href="http://dsoguy.blogspot.com/2010/04/clustered.html"&gt;just by adding 2 lines of config&lt;/a&gt;. I was pretty shocked and excited about what a tremendous reaction this blog and the toolkit received. Usually when I write a blog most of it's traffic comes from awesome sites like &lt;a href="http://www.dzone.com/"&gt;DZone&lt;/a&gt; but this blog was different. I actually got considerably more direct traffic from things like e-mails and twitter than anything conventional. That kind of viral excitement shows a much deeper level of curiosity and is tremendously motivating for the team here. Anyway, I digress.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Me being the curious type I decided to do something a little dangerous yesterday. I asked &lt;a href="http://rifers.org/blogs"&gt;Geert, one of the leads&lt;/a&gt; on the Terracotta toolkit project, if we were in a state where I could play around with it a bit and get a sense of how hard it is to get started. We discussed the usual caveats, "We haven't agreed on some of the naming and factoring stuff yet?" which I clearly understood. Knowing that fact and that I'd be working &lt;a href="feed://download.terracotta.org/rss/trunk.rss"&gt;off a nightly&lt;/a&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); -webkit-text-decorations-in-effect: none; "&gt;&lt;a href="feed://download.terracotta.org/rss/trunk.rss"&gt;(this link downloads it)&lt;/a&gt; I set out to follow his simple instructions and see just how easy it was. Here is what I did.&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); -webkit-text-decorations-in-effect: none; "&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;Geert gave me a simple cyclic barrier sample to work off of. This is a sample I've whipped up my self a few times over the years. Many of our earliest users leveraged Terracotta strictly as a distributed lock manager and that's what this simple sample does as well. You start the app with a barrier name and a node count and it just hangs until the node count is reached. Seems like as good of a sample as any to highlight how to get started with the toolkit.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Arial, serif;font-size:medium;"&gt;Downloaded &lt;a href="feed://download.terracotta.org/rss/trunk.rss"&gt;the nightly&lt;/a&gt; and unpacked&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;tar -xzvf terracotta-trunk-nightly-rev15534.tar.gz&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Grabbed a quick sample app&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#961a65;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); white-space: normal; "&gt;&lt;span style="color:#961a65;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;import&lt;/span&gt; org.terracotta.api.ClusteringToolkit;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#961a65;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); white-space: normal; "&gt;&lt;span style="color:#961a65;"&gt; import&lt;/span&gt; org.terracotta.api.TerracottaClient;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#961a65;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;import&lt;/span&gt; org.terracotta.coordination.Barrier;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#961a65;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;public&lt;/span&gt; &lt;span style="color:#961a65;"&gt;class&lt;/span&gt; PlayingWithExpressBarrier {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;    &lt;span style="color:#961a65;"&gt;public&lt;/span&gt; &lt;span style="color:#961a65;"&gt;static&lt;/span&gt; &lt;span style="color:#961a65;"&gt;void&lt;/span&gt; main(String[] args) {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;&lt;span style="color:#961a65;"&gt;final&lt;/span&gt; String barrierName = args[0];&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;&lt;span style="color:#961a65;"&gt;final&lt;/span&gt; &lt;span style="color:#961a65;"&gt;int&lt;/span&gt; numberOfParties = Integer.parseInt(args[1]);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;//Start the Terracotta client&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;ClusteringToolkit clustering = &lt;span style="color:#961a65;"&gt;new&lt;/span&gt; TerracottaClient(&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#3b3df5;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;/span&gt;"localhost:9510"&lt;span style="color:#000000;"&gt;).getToolkit();&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#3b3df5;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/p&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#3b3df5;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;//Get an instance of a barrier by name&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;Barrier barrier = clustering.getBarrier(barrierName, &lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;       &lt;/span&gt;numberOfParties);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;&lt;span style="color:#961a65;"&gt;try&lt;/span&gt; {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;System.&lt;span style="color:#032fc3;"&gt;out&lt;/span&gt;.println(&lt;span style="color:#3b3df5;"&gt;"Waiting ..."&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;&lt;span style="color:#961a65;"&gt;int&lt;/span&gt; index = barrier.await();&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;System.&lt;span style="color:#032fc3;"&gt;out&lt;/span&gt;.println(&lt;span style="color:#3b3df5;"&gt;"... finished "&lt;/span&gt; + index);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;} &lt;span style="color:#961a65;"&gt;catch&lt;/span&gt; (Exception e) {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;      &lt;/span&gt;e.printStackTrace();&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;     }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I worked in eclipse so at this point all I had to do is add the toolkit jar to the classpath to get it to compile&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;terracotta-trunk-nightly-rev15534/common/terracotta-toolkit-1.0-runtime-1.0.0-SNAPSHOT.jar&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Now kickoff the Terracotta server &lt;/li&gt;&lt;/ul&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;terracotta-trunk-nightly-rev15534/bin/start-tc-server.sh &lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt; And run the sample 3 time&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;java -cp .:terracotta-toolkit-1.0-runtime-1.0.0-SNAPSHOT.jar barrierName 3&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first two nodes should hang waiting for the 3rd node. Once the 3rd node is started all three should run to completion. This is just a little taste of what is coming. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The toolkit will have highly concurrent maps, locks, counters, queues, evictors and more so stay tuned. All of the toolkit classes will have tests in our TCK. The toolkit will run on any 1.5/1.6 JVM and requires no boot-jars, agents or container specific code. Given versions of the TCK will allow people to just drop in that toolkit jar at runtime for any app developed using that version of the API provided by the version of the TCK. I'll talk a bit more about how versioning the toolkit API will work in a future blog but it will work like any other spec. You can use any implementation that implements the spec. Enjoy, much more to come. &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4466138331276095037?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4466138331276095037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4466138331276095037' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4466138331276095037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4466138331276095037'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/05/couple-minutes-with-terracotta-toolkit.html' title='A Couple Minutes With Terracotta Toolkit Nightly'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2547672851169853916</id><published>2010-04-29T09:23:00.000-07:00</published><updated>2010-10-05T16:30:58.799-07:00</updated><title type='text'>Countdown To The Terracotta Toolkit Beta</title><content type='html'>&lt;div&gt;&lt;b&gt;Countdown To The Terracotta Toolkit Beta&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Over the last year, &lt;a href="http://www.terracotta.org"&gt;Terracotta&lt;/a&gt; has launched four great products backed by the snap-in HA and scalability of the Terracotta Server Array: &lt;a href="http://www.terracotta.org/ehcache/"&gt;Enterprise Ehcache&lt;/a&gt;, &lt;a href="http://www.terracotta.org/bigmemory"&gt;BigMemory for Enterprise Ehcache&lt;/a&gt;, &lt;a href="http://www.terracotta.org/web-sessions/"&gt;Web Sessions&lt;/a&gt; and &lt;a href="http://www.terracotta.org/quartz/"&gt;Quartz Scheduler&lt;/a&gt;.  Building these products has left us feeling a bit greedy.  In order to free ourselves from this guilt we've created a toolkit that has allowed us to rapidly build these easy-to-use, high-scale/HA products.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Revolution Begins&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So why should we be the only ones who have all the fun. Lots of smart people out there can build clustered caches, frameworks, and tools? So we are creating the Terracotta toolkit and adjacent Terracotta Compatibility Kit. We will be releasing a set of standard parts like highly concurrent distributed maps, clustered evictors, queues, locks, counters, cluster events etc that can be used by anyone so that they might realize their vision of what the developers of the world should use. This kit was built with a few core goals in mind:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Ease of use is paramount&lt;/b&gt; - For both the developers that leverage the Terracotta toolkit and the people who use the stuff built using the Terracotta toolkit&lt;/li&gt;&lt;li&gt;&lt;b&gt;Stable API matters&lt;/b&gt; - We are building a compatibility kit and will maintain a strict and clear versioning scheme so that framework developers can rely on and clearly know what versions of Terracotta can work with the API version used in the application. Your users can just drop in any version of the terracotta-toolkit.jar that implements the version of the API you coded against.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Parts is Parts &lt;/b&gt;- Get all the useful parts we use to build our products packaged and out for others to use.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Scale Continuum&lt;/b&gt; - The parts should work both clustered and unclustered continuing our vision of a scale continuum.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The beta of this toolkit is a few  short weeks away and we can't wait to see what great stuff people will build on it. Come show us how a cache should be built, come show us what tools we haven't even thought of.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With this toolkit pretty much any framework developer will be able to build out their HA, distributed and scale out dreams.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2547672851169853916?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2547672851169853916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2547672851169853916' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2547672851169853916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2547672851169853916'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/04/countdown-to-terracotta-toolkit-beta.html' title='Countdown To The Terracotta Toolkit Beta'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-260346345322716152</id><published>2010-04-26T18:32:00.000-07:00</published><updated>2010-04-27T14:15:48.186-07:00</updated><title type='text'>Dave Klein's Scale Grails Webinar</title><content type='html'>As someone who spent years in the Smalltalk world I have a special place in my heart for powerful/flexible frameworks and languages that strive for simplicity for the developer. &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; is one of the most powerful and flexible frameworks around and modern representation of those Smalltak values. Some would argue that it's only major missing features are scale-out and HA. The great news on that front is that Grails is built on &lt;a href="http://quartz-scheduler.org/"&gt;Quartz&lt;/a&gt;, &lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt;, &lt;a href="http://www.terracotta.org/start/start-web-sessions"&gt;Http Sessions&lt;/a&gt; and &lt;a href="http://www.terracotta.org/start/start-hibernate"&gt;Hibernate&lt;/a&gt; all of which can be scaled with &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; in a couple lines of config each. By scaling these four frameworks you can completely scale Grails.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://terracotta.webex.com/ec0605lb/eventcenter/recording/recordAction.do;jsessionid=xJd7LXTJPFQTWpLzphlh1DtybQjkQT4C32LRqq1LJQNtLRHGByLC!442814278?theAction=poprecord&amp;amp;actname=%2Feventcenter%2Fframe%2Fg.do&amp;amp;actappname=ec0605lb&amp;amp;renewticket=0&amp;amp;renewticket=0&amp;amp;apiname=lsr.php&amp;amp;entappname=url0107lb&amp;amp;needFilter=false&amp;amp;&amp;amp;isurlact=true&amp;amp;rID=2261742&amp;amp;entactname=%2FnbrRecordingURL.do&amp;amp;rKey=f4c3ddb2a8f25285&amp;amp;recordID=2261742&amp;amp;siteurl=terracotta&amp;amp;rnd=6656552923&amp;amp;SP=EC&amp;amp;AT=pb&amp;amp;format=short"&gt;Check out this webinar&lt;/a&gt; from the guy who wrote the book on Grails &lt;a href="http://dave-klein.blogspot.com/"&gt;Dave Klein&lt;/a&gt; and and learn about it for yourself:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-260346345322716152?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/260346345322716152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=260346345322716152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/260346345322716152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/260346345322716152'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/04/persistent-quartz-jobs-for-your-grails.html' title='Dave Klein&apos;s Scale Grails Webinar'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2738255129450992865</id><published>2010-04-22T15:59:00.000-07:00</published><updated>2010-04-22T16:59:43.796-07:00</updated><title type='text'>@Scale Conference 2010!</title><content type='html'>In today's world of internet scale applications, enormous companies and cloud many applications and application developers are struggling provide the needed scale/ha. They've developed their middleware toolkit of application server, hibernate, caching, and scheduling in order to achieve the business goals and single node performance required of them. But now they need to take those applications and frameworks to the next level. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They need scale out!&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's where the &lt;a href="http://atscale2010.eventbrite.com/"&gt;@Scale conference&lt;/a&gt; can help. In San Francisco at the same time as &lt;a href="http://www.oracle.com/us/javaonedevelop/062264.html"&gt;Oracle Open World/JavaOne&lt;/a&gt; attendees of this one day conference will learn from the leaders in cloud and application scale.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Jeff Barr of Amazon&lt;/li&gt;&lt;li&gt;Simon Crosby, CTO of Citrix&lt;/li&gt;&lt;li&gt;Rich Wolski, founder of Eucalyptus&lt;/li&gt;&lt;li&gt;Adrian Cole, found of JClouds&lt;/li&gt;&lt;li&gt;Paul Querna of CloudKick and libcloud fame&lt;/li&gt;&lt;li&gt;Jos Thosman of Canonical--the Ubuntu guys who also do UEC&lt;/li&gt;&lt;li&gt;Greg Luck - founder of ehcache&lt;/li&gt;&lt;li&gt;James House - founder of quartz&lt;/li&gt;&lt;li&gt;Ari Zilka from Terracotta&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"   style="  ;font-family:arial, helvetica, sans-serif;font-size:medium;"&gt;Dan Querna, Founder of Cloudkick&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial, helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Do not miss this opportunity to work with, listen to and learn from the best in the business. The conference is focused on the scale problems you face and real solutions you can apply. Learn about those solutions from the people who created them!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial, helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial, helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Don't pull your hair out solving problems that are already solved. Come to @Scale 2010!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial, helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial, helvetica, sans-serif;"&gt;Signup now and get the early bird prices! Space is limited so signup before it fills up.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial, helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial, helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; "&gt;&lt;b&gt;What:&lt;/b&gt; &lt;a href="http://atscale2010.eventbrite.com/"&gt;Sign up here: @Scale conference&lt;/a&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Where:&lt;/b&gt; San Francisco, SOMA&lt;/div&gt;&lt;div&gt;&lt;b&gt;When:&lt;/b&gt; Friday Sept 24th 8am-4pm&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial, helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial, helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2738255129450992865?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2738255129450992865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2738255129450992865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2738255129450992865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2738255129450992865'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/04/scale-conference-2010.html' title='@Scale Conference 2010!'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4789493081259650517</id><published>2010-04-22T09:37:00.000-07:00</published><updated>2010-04-22T11:21:30.240-07:00</updated><title type='text'>&lt;terracotta clustered="true"/&gt;</title><content type='html'>&lt;div&gt;One challenge with drastically simplifying  &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; as a tool for application scale is getting the word out that it's occurred!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The subject of this blog is one of two lines of config and a jar on the classpath that move &lt;a href="http://www.ehcache.org/"&gt;Ehcache&lt;/a&gt; to be a coherent distributed cache. The line of config in the subject says, "Hey, cluster this cache." The other line, which looks something like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"&amp;lt;terracottaConfig url="localhost:9510" /&amp;gt;"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;tells Ehcache where to find the Server Array.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This same story is true for scaling out &lt;a href="http://www.terracotta.org/start/start-web-sessions"&gt;Http Sessions&lt;/a&gt;, &lt;a href="http://www.terracotta.org/start/start-quartz?was-expanded=start-hibernate-submenu"&gt;Quartz Scheduling&lt;/a&gt; and &lt;a href="http://www.terracotta.org/start/start-hibernate?was-expanded=ehcache-submenu"&gt;Hibernate Caching&lt;/a&gt;. A whole new world of scale is available to the applications we all write. It free's us from complex sharding, awkward CAP trade offs and endless DB tuning. And the cherry on top is it's open source.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No recompile, no code changes, no magic tricks or additional knowledge. I could train my dog to scale an application built on these ubiquitous frameworks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Check out these blogs to learn more:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Arial;font-size:medium;"&gt;&lt;div&gt;&lt;a href="http://dsoguy.blogspot.com/2009/10/distributed-coherent-ehcache-in-less.html"&gt;Add Scale and HA to Ehcache In Less Than 5 Minutes&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dsoguy.blogspot.com/2009/12/clustered-quartz-scheduler-in-5-minutes.html"&gt;Add Scale and HA to Quartz Scheduler In Less Than 5 Minutes&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4789493081259650517?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4789493081259650517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4789493081259650517' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4789493081259650517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4789493081259650517'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/04/clustered.html' title='&amp;lt;terracotta clustered=&amp;quot;true&amp;quot;/&amp;gt;'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-5603066499885880356</id><published>2010-04-20T21:10:00.000-07:00</published><updated>2010-06-03T11:35:08.996-07:00</updated><title type='text'>Ehcache 2.1 Beta - Lots of Stuff, Still Backward Compatible</title><content type='html'>&lt;div&gt;&lt;b&gt;UPDATE: 2.1 went GA March 21st&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The &lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt; dev team is  pretty excited to be getting 2.1 beta out for the world to try. This release is focused on 3 primary goals:&lt;div&gt;&lt;ul&gt;&lt;li&gt;Build on our vision of an application scale continuum from one node to the cloud.&lt;/li&gt;&lt;li&gt;Improve Ehcache performance both unclustered and clustered.&lt;/li&gt;&lt;li&gt;Improve Ehcache applicability for both unclustered and clustered.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;What did we do in the name of these goals? Good question!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Scale Continuum&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In this release we are focused on taking features that had been added for  the&lt;a href="http://ehcache.org/documentation/distributed_caching_with_terracotta.html"&gt; Terracotta Clustered&lt;/a&gt; version of Ehcache and extending them back to the &lt;a href="http://ehcache.org/documentation/index.html"&gt;unclustered version&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The following features fall into that category:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ehcache.org/documentation/explicitlocking.html"&gt;The Explicit Locking Module&lt;/a&gt; - This module allows you to acquire and release locks manually for given keys. It required some significant rework in the unclustered stores but this now works just as well unclustered as it does clustered supporting fully coherent operations.&lt;/li&gt;&lt;li&gt;&lt;a href="http://ehcache.org/documentation/jta.html"&gt;JTA&lt;/a&gt; - In 2.0 of Ehcache we added JTA support when clustered via Terracotta. In 2.1 we extended that functionality to unclustered and have begun the process of performance tuning to go along with its XA compliance.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Performance&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While performance wasn't a big focus of this release (It is for the next release) we were able to considerably improve Ehcache "put" performance due to the significant work we did on the disk store and locking architecture. We'll also be spending some time tuning JTA but that work did not make it into the beta.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Applicability&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Here we did some considerable work.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ehcache.org/documentation/jta.html"&gt;JTA for Hibernate Second Level Cache &lt;/a&gt;- We added support for using Ehcache JTA in a second level cache both clustered and unclustered.&lt;/li&gt;&lt;li&gt;&lt;a href="http://ehcache.org/documentation/unlocked_reads_view.html"&gt;UnlockedReadsView&lt;/a&gt; - This is a subtle but important feature. For those who are using a coherent cache but have some part of an application that needs to be able to read at high rates without impacting the rest of the cache this view is a huge help.&lt;/li&gt;&lt;li&gt;&lt;a href="http://ehcache.org/documentation/non_stop_cache.html"&gt;NonStopCache&lt;/a&gt; - Useful for guaranteeing that your cache can never stop your application. On a per cache basis an application can avoid holdups caused by problems such as a slow disk in an unclustered cache or a network outage in a clustered one.&lt;/li&gt;&lt;li&gt;&lt;a href="http://ehcache.org/apidocs/index.html"&gt;New Coherent methods &lt;/a&gt;- We've added useful methods like putIfAbsent and replace to simply and easily work with a clustered or unclustered cache in a fully coherent manner. Together with the explicit locking wrapper much is possible.&lt;/li&gt;&lt;li&gt;We also added a bunch of tests and &lt;a href="http://ehcache.org/documentation/web_caching.html"&gt;bug fixes to the web-cache&lt;/a&gt;, an extremely useful tool for making performant web applications.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Summing up...&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While still in beta we feel like Ehcache 2.1 is another exciting step for our product family. It adds performance, significant features and is still backward compatible. It continues our vision of an application scale continuum from one node to the cloud without burdening the developer with complexity. One set of frameworks, one application, scale out is added at runtime. We are really excited about this vision and are working tirelessly at extending it to all our users' needs. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please &lt;a href="http://www.terracotta.org/dl/ehcache-oss-sign-up"&gt;Download Ehcache 2.1 Beta&lt;/a&gt;, put it through it's paces and give us lots of feedback!&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-5603066499885880356?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/5603066499885880356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=5603066499885880356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/5603066499885880356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/5603066499885880356'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/04/ehcache-21-beta-lots-of-stuff-still.html' title='Ehcache 2.1 Beta - Lots of Stuff, Still Backward Compatible'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-6098207155727759195</id><published>2010-04-19T21:11:00.000-07:00</published><updated>2010-04-19T22:31:42.013-07:00</updated><title type='text'>Application Server Instead Of Web Server</title><content type='html'>I'm starting to see a small but growing group of sites forgoing web servers and going straight to the Application Server in the Java world. This has some obvious advantages:&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Less infrastructure&lt;/li&gt;&lt;li&gt;Java doesn't have buffer overflows and is a bit more secure&lt;/li&gt;&lt;li&gt;You can do much more interesting caching by having the web serving and app serving in the same layer&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was excited to see this blog today and just wanted to point people to it and see what thoughts are out there both pro and con on this trend.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://softwaredevthoughts.blogspot.com/2010/04/web-application-architecture-do-i.html"&gt;Web Application Architecture - do I really need Apache?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-6098207155727759195?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/6098207155727759195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=6098207155727759195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6098207155727759195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6098207155727759195'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/04/application-server-instead-of-web.html' title='Application Server Instead Of Web Server'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2316767142314823534</id><published>2010-02-03T23:10:00.001-08:00</published><updated>2010-02-03T23:21:08.677-08:00</updated><title type='text'>How Much Is Google Really Spending?</title><content type='html'>This will be a short blog. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Has anyone else noticed that google is using adwords extensively to pimp the nexus one? They must be spending a fortune in lost revenue from other ad sources. Since they don't have to pay for those ads I wonder if even they have an accounting of how much they are spending on this thing. At first I thought the nexus one looked interesting but...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;T-Mobile only&lt;/div&gt;&lt;div&gt;No Exchange support&lt;/div&gt;&lt;div&gt;weird app space restrictions&lt;/div&gt;&lt;div&gt;and from what I've read poor touch screen keyboard&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the plus side:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nice screen&lt;/div&gt;&lt;div&gt;Solid camera with flash&lt;/div&gt;&lt;div&gt;really fast processor&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With this kind of marketing muscle it's probably just a matter of time before it gets wide adoption but I suspect it's still a couple years away from being really good.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2316767142314823534?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2316767142314823534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2316767142314823534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2316767142314823534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2316767142314823534'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2010/02/how-much-is-google-really-spending.html' title='How Much Is Google Really Spending?'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4112367117519843151</id><published>2009-12-30T22:47:00.000-08:00</published><updated>2010-01-20T13:10:08.061-08:00</updated><title type='text'>From Performance to Scale - A Software Story... Part I</title><content type='html'>When building most applications whether it's JEE, Spring, Grails or plain old Tomcat their are a series of common tools that are used. HttpsSessions is used for managing the state of the web portion, ORM for talking to a database,  a cache to hold interimediate application state and a scheduler to make things happen at a certain time, place or interval. Out of the box it is quite easy to get started with these components. However, as an application makes it's way into production it often needs improved performance, often followed by HA and then scale-out.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This blog is about a journey. It's about taking an application from performance all the way to scale-out without rewrites and using the components that you already have.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;In the beginning it's just the Application&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The good news is that whether you're a JBoss person, a Spring person, a Grails person or a Tomcat person your really using the same key components. Almost everyone in these environments are using &lt;a href="http://hibernate.org/"&gt;Hibernate&lt;/a&gt; as an ORM, the &lt;a href="http://en.wikipedia.org/wiki/HTTP_cookie"&gt;Http Session Spec&lt;/a&gt;, &lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt; for caching/performance and &lt;a href="http://quartz-scheduler.org/"&gt;Quartz&lt;/a&gt; for scheduling. So while their is no official standard, the global consensus is pretty clear. If it's me I would start from &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; (which is built on Spring, Ehcache, Quartz and Hibernate) but doesn't require the 2 weeks of picking, deeply understanding and piecing together components that is required with most other approaches.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Round 1, Performance&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;So you've written your single node application using the usual components. Turns out, it's slow. Now what? Well the first thing you need to do is understand why it's slow at a high level. I usually check the following obvious things:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) CPU bound - Check machines CPU stats on all nodes (including DB), now day you also need to figure out if one of your CPU's is maxed out which could mean the app needs more parallelism&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) GC Bound - Use verbose GC or your favorite tool&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) Database bottleneck - A number of tools and tricks exist to see if your database is the bottleneck. My favorite ways are:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- Keep track of and monitor query times and or look at hibernate stats&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- Take thread dumps. If all threads are blocked on DB calls something is wrong&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- Check resource Utilization on the Database machine&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) I also like to isolate operations and see which ones are slow or create slowness. This can tell you a lot about where to focus.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, so now you know why things are slow and your in the same boat as about 90 percent of the world. The Database is the number one bottleneck. &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;div&gt;&lt;b&gt;Tuning the ORM&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Many start by generating the ORM schema using tools. This usually ends up being a completely &lt;a href="http://en.wikipedia.org/wiki/Database_normalization"&gt;Normalized&lt;/a&gt; database that requires expensive queries. At this stage of development it's almost certain that this is where your performance problems will be. Aside from the usual mistakes like missing JDBC connection pool or bad JDBC Connection pool (Use &lt;a href="http://sourceforge.net/projects/c3p0/"&gt;C3PO&lt;/a&gt; and make sure your seeing parallelism. Many of the others are either useless or broken). The next thing to do is to try &lt;a href="http://ehcache.org/documentation/hibernate.html"&gt;hibernate 2nd level caching&lt;/a&gt;. If your application is read heavy this can have an amazing impact on performance. Entity caching is generally the way to start. The most common gotcha is it getting invalidated by custom SQL. It is a little known fact that if you execute custom sql through hibernate it clears the cache making it useless. If you are going to do Query caching you &lt;a href="http://tech.puredanger.com/2009/07/10/hibernate-query-cache/"&gt;MUST READ THIS BLOG&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now you've got hibernate 2nd level caching turned on and you've tuned it. The database isn't the bottleneck anymore but your seeing a lot of GC and thread dumps show contention on Hibernate itself. Especially when displaying medium size to large tables of data on the screen. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Plus, it turns out that updating the database on every intermediate operation that occurs is pounding the databases locks, cpu and disk. It's also made my schema really unwieldy What do I do now?&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Stepping up to Caching&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;If after 2nd level caching you still have performance problems it is usually time to look at application level caching. This can be extremely helpful for performance. If your seeing:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;a) A lot of garbage creation around calculating results&lt;/div&gt;&lt;div&gt;b) cpu usage or contention getting information&lt;/div&gt;&lt;div&gt;c) Latency from IO in retrieving information from disk, a web service or a DB&lt;/div&gt;&lt;div&gt;d) Pounding your database with fine grained updates/information with information that you only needed for a short time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You'll likely want to start caching. Some things to cache include:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) heavily used reference data from the database - States, zipcodes, product ID's etc&lt;/div&gt;&lt;div&gt;2) Intermediate state - If a series of operations occur but all you care about is the end result. Cache until the end result is reached then put in the DB.&lt;/div&gt;&lt;div&gt;3) heavily reused calculated values - "Like totally searching for Britney Spears."&lt;/div&gt;&lt;div&gt;4) Temporary values that are only needed for a set amount of time - user sessions or data that is needed at a certain time of day.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hopefully between the Hibernate caching and tuning and the Application data caching you've now got much of your performance issues under control.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Your application probably does some scheduling and uses http sessions but these rarely create performance problems in one node.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Part II - Now that it's performaning what about availability?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Part III - One node isn't enough anymore I need scale-out&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4112367117519843151?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4112367117519843151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4112367117519843151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4112367117519843151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4112367117519843151'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/12/from-performance-to-scale-software.html' title='From Performance to Scale - A Software Story... Part I'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-8028798522513117140</id><published>2009-12-16T15:58:00.001-08:00</published><updated>2010-01-12T19:00:55.326-08:00</updated><title type='text'>Clustered Quartz Scheduler In 5 Minutes</title><content type='html'>Need a fast clustered/persistent Quartz Job Scheduler?  &lt;a href="http://quartz-scheduler.org/"&gt;Quartz Scheduler&lt;/a&gt;, the ubiquitous job scheduler built into Spring, JBoss and Grails can be configured to provide those features in under 5 minutes in this brief tutorial.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;A Brief Digression Into The Why&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Why do I need a persistent scaled out job scheduler? The main use cases for a clustered/persistent job scheduler are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HA - You need to be able to restart your application without losing scheduled jobs&lt;/li&gt;&lt;li&gt;Scale Out - Your application now needs more than one node to handle the load it receives and you want your scheduled jobs to distribute across nodes.&lt;/li&gt;&lt;li&gt;You are using a database to persist and or scale your scheduler and you are seeing DB load/locking issues and or you find it two difficult to setup or maintain.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Steps:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) Download Terracotta 3.2 (Which includes Quartz Scheduler) &lt;a href="http://www.terracotta.org/dl/oss-download-catalog"&gt;http://www.terracotta.org/dl/oss-download-catalog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) Put the following jars in your class path (all included in the quartz-1.7.0 directory of the Terracotta kit from above):&lt;br /&gt;&lt;br /&gt;quartz-1.7.0.jar - regular quartz jar&lt;br /&gt;quartz-terracotta-1.0.0.jar - Terracotta clustered store&lt;br /&gt;&lt;br /&gt;3) Whip up some scheduler code:&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; public class QuartzSample {&lt;br /&gt;&lt;br /&gt;public void startJobs() throws Exception {&lt;br /&gt;  Properties props = new Properties();&lt;br /&gt;  props.load(QuartzSample.class.getClassLoader().getResourceAsStream("org/quartz/quartz.properties"));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  // **** Begin Required TC props&lt;br /&gt;  props.setProperty(StdSchedulerFactory.PROP_JOB_STORE_CLASS,"org.terracotta.quartz.TerracottaJobStore");&lt;br /&gt;  props.setProperty("org.quartz.jobStore.tcConfigUrl", "localhost:9510");&lt;br /&gt;  // *** End Required Terrocotta Stuff&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  StdSchedulerFactory factory = new StdSchedulerFactory(props);&lt;br /&gt;  Scheduler scheduler = factory.getScheduler();&lt;br /&gt;  scheduler.start();&lt;br /&gt;  if (scheduler.getJobDetail("myJob", "myGroup") == null) {&lt;br /&gt;    System.out.println("Scheduling Job!");&lt;br /&gt;    JobDetail jobDetail = new JobDetail("myJob", "myGroup", DumbJob.class);&lt;br /&gt;    Trigger trigger = TriggerUtils.makeSecondlyTrigger(5);&lt;br /&gt;    trigger.setName("myTrigger");&lt;br /&gt;    scheduler.scheduleJob(jobDetail, trigger);&lt;br /&gt;  } else {&lt;br /&gt;    System.out.println("Job Already Scheduled!");&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static class DumbJob implements Job {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void execute(JobExecutionContext arg0) throws JobExecutionException {&lt;br /&gt;    System.out.println("Works baby");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) throws Exception {&lt;br /&gt;  new QuartzSample().startJobs();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;** NOTE: Notice the two lines of properties that set things up for clustering with Terracotta in the sample. That's the only difference from single node unclustered Quartz.&lt;br /&gt;&lt;br /&gt;4) Start the Terracotta server by running start&lt;br /&gt;&lt;br /&gt;./start-tc-server.sh&lt;br /&gt;&lt;br /&gt;in the bin directory of the Terracotta kit&lt;br /&gt;&lt;br /&gt;5) Run the sample code above and watch it run the job every 5 seconds. Then kill the sample app and restart it. The app will tell you that the job is already scheduled and the job will continue.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Two lines of configuration and a server takes you from ubiquitous job scheduler built into Spring, JBoss and Grails to scale out and persistence.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;Have fun!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-8028798522513117140?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/8028798522513117140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=8028798522513117140' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8028798522513117140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8028798522513117140'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/12/clustered-quartz-scheduler-in-5-minutes.html' title='Clustered Quartz Scheduler In 5 Minutes'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4954416037925126463</id><published>2009-11-06T13:39:00.001-08:00</published><updated>2009-11-18T22:01:12.849-08:00</updated><title type='text'>Welcome James House and The Quartz Community</title><content type='html'>I'm excited to be welcoming James House and &lt;a href="http://quartz-scheduler.org/"&gt;Quartz&lt;/a&gt; to the &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; and &lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt; Fold. The Terracotta dev and field teams have long believed that scheduling and coordination are hugely important parts of applications from single node to scaled out architecture. In Java that leads you to one place. Quartz! We believe James and Quartz are an excellent fit with our community and suite of products that are useful from single node to the cloud.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quartz Scheduler is both a best of bread and a ubiquitous product. We are getting right to work on contributing. The first step along the path is the &lt;a href="http://maven.apache.org/"&gt;Mavenization&lt;/a&gt; and &lt;a href="http://hudson-ci.org/"&gt;Hudsonifaction&lt;/a&gt; of the Quartz project which has already been completed! We also are ready with a &lt;a href="http://www.terracotta.org/quartz/get-started"&gt;beta version of Quartz Terracotta Express edition&lt;/a&gt;. It's an HA/Durability/scale-out version of Quartz that requires no DB and is so simple it can be leveraged in minutes by existing Quartz users. We look forward to working with James to create the most usable and useful enterprise class open source scheduler available and the enterprise class support product to go with it. We have lots of great feature ideas and we look forward to the journey ahead.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4954416037925126463?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4954416037925126463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4954416037925126463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4954416037925126463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4954416037925126463'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/11/welcome-james-house-and-quartz.html' title='Welcome James House and The Quartz Community'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-1644515808682056240</id><published>2009-10-26T18:35:00.000-07:00</published><updated>2009-10-26T20:07:51.962-07:00</updated><title type='text'>What To Do If Your iTunes Gets iHacked...</title><content type='html'>Please make sure you watch your iTunes receipts/charges. In the last week or so someone somehow started using my iTunes account to purchase music illegally. Yep, I got iHACKED! Fortunately I only got 2 bills worth around 75 bucks but if I hadn't been paying attention it could have been much worse. So make sure you read those statements! &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If this happens to you immediately change your password and remove your credit card information from the iTunes site/app. You do this by:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt; Clicking on the store menu while in iTunes and then selecting the "View my account" menu item. From there click "Edit" on the main screen where it says "Payment Information" and select credit card type "None". &lt;/li&gt;&lt;li&gt;Next change your password. In the same "View My Account" screen click "Edit Account Info." That will take you to a screen where you can change your password.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, now that you've protected yourself you need to get your money back. Unlike Amazon or Zappos contacting support and reporting the fraud DOES NOT lead to a refund. They will direct you to your credit card company to refute the charge. I did this and it appears to be successful (I found it disappointing that Apple didn't just take care of this for me). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a side note, when shopping online make sure you have a credit card company that takes responsibility for stuff. Amex has always been great and I'm sure other good companies exist as well. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UPDATE: &lt;/b&gt;&lt;/div&gt;&lt;div&gt;Looks like I'm not alone here. &lt;a href="http://garysaid.com/is-my-apple-itunes-account-hacked/"&gt;This blog&lt;/a&gt; reads like I could have written it. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-1644515808682056240?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/1644515808682056240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=1644515808682056240' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1644515808682056240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1644515808682056240'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/10/what-to-do-if-your-ihacked.html' title='What To Do If Your iTunes Gets iHacked...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2790078149423708749</id><published>2009-10-26T16:29:00.000-07:00</published><updated>2009-12-18T17:04:48.454-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ehcache'/><title type='text'>5 Hints You're Using A Map When You Should Be Using a Cache?</title><content type='html'>&lt;div&gt;When developing software in Java one almost always ends up with a few maps that contain keyed data. Whether it's username -&gt; conversational state, state code -&gt; full state name, or cached data from a database. At what point do you move from a basic Map (or one of it's more fancy variants like LinkedHashMap subclasses or ConcurrentHashMap) to an open source, light weight cache like &lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt;?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;Here are 5 quick things to look for:&lt;/b&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Helvetica,serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Helvetica,serif;"&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;5) You've built your own Map loader framework for bootstrapping and/or reads triggering loading&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;4) You need to be able to visualize and/or control your Map via JMX or a console. For example you want to watch the hit rate of your Map or track the size of your Map.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;3) You're hacking in "overflow to disk" functionality and or persistence for your Map in order to handle memory pressure and/or restartability.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;2) You're hacking in special behavior to cluster Maps when you scale out. This includes things like &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;writing your own invalidation and/or replication solution over jms or RMI&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;1) You find yourself implementing your own eviction strategies.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Avoid The Slippery Slope:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's a slippery slope. First you add in one feature, then another, and next thing you know you've reinvented the cache wheel. No point in doing that. There are great caches out there that are apache licensed, light weight and have the above features you need and more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;To learn more about Ehcache check it out at &lt;a href="http://www.ehcache.org/"&gt;ehcache.org »&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2790078149423708749?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2790078149423708749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2790078149423708749' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2790078149423708749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2790078149423708749'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/10/5-hints-your-using-map-when-you-should.html' title='5 Hints You&apos;re Using A Map When You Should Be Using a Cache?'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-3248590957622360467</id><published>2009-10-23T15:51:00.000-07:00</published><updated>2009-10-23T16:00:20.454-07:00</updated><title type='text'>Excellent Blog On Code Smells...</title><content type='html'>This is a really good/short blog that highlights some code smells that everyone should look out for. It's not a complete diary or anything but when I read it I felt like it could have been written by me.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.dzone.com/links/8_signs_your_code_sucks.html?ref=ps"&gt;8 Signs Your Code Sucks...&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He also has a follow on which I agree with.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.turnleafdesign.com/?p=255"&gt;Comments are a sign of bad code and I am not sorry for saying it&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-3248590957622360467?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/3248590957622360467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=3248590957622360467' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3248590957622360467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3248590957622360467'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/10/excellent-blog-on-code-smells.html' title='Excellent Blog On Code Smells...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-3203456664046433245</id><published>2009-10-23T14:09:00.000-07:00</published><updated>2009-10-23T14:27:27.886-07:00</updated><title type='text'>Improved Web Browsing By Controlling Flash</title><content type='html'>I have a few pet annoyances when surfing the web.&lt;br /&gt;&lt;br /&gt;* I find it disruptive to have audio play when I hit a web page (though I usually keep my sound off)&lt;div&gt;* I don't like when video plays automatically when I hit a web page.&lt;br /&gt;* I don't like when my computer heats up and the battery drains when I'm not doing anything just because&lt;br /&gt;I left a web page/tab open.&lt;div&gt;* Some pages that look rather slim take a disproportionately long time to load (there are lots of reasons for this but flash seems to be one of them)&lt;br /&gt;&lt;br /&gt;Turns out that I was able to mostly solve those problems by using one of the many flash control&lt;br /&gt;plugins. I surf on Safari for the most part so I went with &lt;a href="http://rentzsch.github.com/clicktoflash/"&gt;ClickToFlash&lt;/a&gt;. FireFox has &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/433"&gt;FlashBlock&lt;/a&gt; which I haven't tried. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The way it works is it shows you frames where flash usually should be. If you want to see what is there then just click on the box and it loads the real flash. It has many other nice features around content but the important one is the one I described.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have to say, when I installed this thing I was absolutely amazed by how many things that looked like regular adds and images were actually flash. You will be astounded. Gotta wonder what these companies are doing with flash when they are showing a static image? I didn't take any official benchmarks but after installing I noticed an increase in battery life and decrease in heat on my computer. This experience makes me actually believe (didn't really at first) Apple's  battery/cpu excuse for not supporting flash on the iPhone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If your like me and only want flash when you want flash. Try it out.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-3203456664046433245?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/3203456664046433245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=3203456664046433245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3203456664046433245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3203456664046433245'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/10/improved-web-browsing-by-controlling.html' title='Improved Web Browsing By Controlling Flash'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-1963128342098735138</id><published>2009-10-02T16:09:00.000-07:00</published><updated>2010-01-12T19:32:59.485-08:00</updated><title type='text'>Distributed Coherent EhCache In less than 5 Minutes...</title><content type='html'>&lt;span class="Apple-style-span"   style="  line-height: 17px; font-family:'Trebuchet MS', Verdana, Arial, sans-serif;font-size:12px;"&gt;Need a fast clustered/persistent cache? &lt;a href="http://ehcache.org/"&gt;Ehcache&lt;/a&gt;, the ubiquitous cache built into Spring, JBoss and Grails can be configured to provide those features in under 5 minutes using this brief tutorial.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: -webkit-xxx-large; line-height: 17px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'Trebuchet MS', Verdana, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: -webkit-xxx-large; line-height: 17px;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; "&gt;&lt;div&gt;&lt;b&gt;A Brief Digression Into The Why&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Why do I need a persistent scaled out cache? The main use cases for a clustered/persistent cache are:&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;I'm using hibernate and it's pounding the database or it's too slow. Use a coherent second level cache to deflect load off the database, reduce latency without getting stale data.&lt;/li&gt;&lt;li&gt;Have a bunch of intermediate data that doesn't belong in the database and/or is expensive to store in the database that I want to keep in memory. Problem is if a node goes down or if someone asks for the data from another node the data is lost&lt;/li&gt;&lt;li&gt;I'm already caching but I have to load data over and over again into every node even though hot data for one node is hot for all (Known as the 1/n effect). If the data is cached for one node it is cached for all.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Steps:&lt;br /&gt;&lt;br /&gt;1) Download the latest Ehcache &lt;a href="http://www.ehcache.org/"&gt;www.ehcache.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) Put the following jars in your class path (all included in the ehcache kit):&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;ehcache-core.jar - Core Ehcache&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;ehcache-terracotta.jar - Terracotta clustering&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; slf4j-api-1.5.8.jar&lt;/span&gt; - Logging API Used by Ehcache&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;slf4j-jdk14-1.5.8.jar - Implementation of the Logging API&lt;/div&gt;&lt;div&gt;&lt;br /&gt;3) whip up some cache code:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; package org.sharrissf.samples;&lt;br /&gt;&lt;br /&gt;import net.sf.ehcache.Cache;&lt;br /&gt;import net.sf.ehcache.CacheManager;&lt;br /&gt;import net.sf.ehcache.Element;&lt;br /&gt;&lt;br /&gt;public class MyFirstEhcacheSample {&lt;br /&gt; CacheManager cacheManager = new CacheManager("src/ehcache.xml");&lt;br /&gt;&lt;br /&gt; public MyFirstEhcacheSample() {&lt;br /&gt;      Cache cache = cacheManager.getCache("testCache");&lt;br /&gt;      int cacheSize = cache.getKeys().size();&lt;br /&gt;      cache.put(new Element("" + cacheSize, cacheSize));&lt;br /&gt;      for (Object key : cache.getKeys()) {&lt;br /&gt;           System.out.println("Key:" + key);&lt;br /&gt;      }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) throws Exception {&lt;br /&gt;      new MyFirstEhcacheSample();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4) Whip up some quick config&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; &amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:noNamespaceSchemaLocation="ehcache.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;terracottaConfig url="localhost:9510" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;defaultCache /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;cache name="testCache" eternal="true"&amp;gt;&lt;br /&gt;                &amp;lt;terracotta clustered="true"/&amp;gt;&lt;br /&gt; &amp;lt;/cache&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/ehcache&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5) Download &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6) Start the terracotta server in the bin directory with the start ./start-tc-server.sh&lt;br /&gt;&lt;br /&gt;Now just run that Java snippet a few times and see your cache grow.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-1963128342098735138?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/1963128342098735138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=1963128342098735138' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1963128342098735138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1963128342098735138'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/10/distributed-coherent-ehcache-in-less.html' title='Distributed Coherent EhCache In less than 5 Minutes...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4525994004069419053</id><published>2009-08-18T07:59:00.000-07:00</published><updated>2009-08-18T09:51:14.488-07:00</updated><title type='text'>Welcome EHCache Community</title><content type='html'>&lt;span class="Apple-style-span"   style="  ;font-family:Arial;font-size:medium;"&gt;&lt;div&gt;I'm excited to be welcoming Greg Luck and the &lt;a href="http://ehcache.org/"&gt;EHCache&lt;/a&gt; community to the Terracotta family. EHCache is an extremely useful/usable product and nearly ubiquitous in the caching space. Greg has spent years solving the important real world problems associated with building highly performant applications. The Terracotta Dev team is very much looking forward to helping accelerate EHCache's development as well as provide the best possible integration with the &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; product family. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;EHCache will remain under the Apache 2 license and we have created the beginnings of a new website at &lt;a href="http://www.ehcache.org/"&gt;www.ehcache.org&lt;/a&gt;. Greg will continue to drive EHCache's vision and direction, as well as being highly involved in it's development. He will also be instrumental in helping Terracotta to define and build out our caching strategy as a whole. His vision, as well as the EHCache community's help are essential in allowing us to together take these products to the next level.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We see a great future of product offerings for your desktop app, on your servers and in your cloud solving the scale/performance problems of today, tomorrow and beyond. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4525994004069419053?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4525994004069419053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4525994004069419053' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4525994004069419053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4525994004069419053'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/08/welcome-ehcache-community.html' title='Welcome EHCache Community'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2371737430402185391</id><published>2009-08-12T09:56:00.000-07:00</published><updated>2009-08-12T10:57:26.220-07:00</updated><title type='text'>Distributed Data Structures: ConcurrentDistributedMap</title><content type='html'>&lt;span class="Apple-style-span"   style="  ;font-family:Arial;font-size:medium;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Concurrent Distributed Data Structures?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Many challenges exist when developing a high scale multi-node application. Our goal at &lt;a href="http://www.terracotta.org"&gt;Terracotta&lt;/a&gt; is to take on those challenges in ways that remove them from the plate of those architecting and developing applications and place them squarely on our shoulders. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In order to accomplish such a lofty goal we first had to create some core pieces of infrastructure on which many higher order abstractions could be built. One such "piece" is our ConcurrentDistributedMap. This data structure is a fundemental piece of our Distributed Cache, our Hibernate product and our Web Sessions product and is also available for use in custom solutions for those using Terracotta as a platform. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Challenges and Tradeoffs&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style=" font-weight: normal; font-size:medium;"&gt;Developing a data structure that is Distributed as well as Concurrent and Coherent has very different trade-offs from developing for a single JVM.  If one took a standard concurrent data structure like ConcurrentHashMap and just clustered it "as is" one would likely run into performance and memory efficiency issues. Even a really cool concurrent data structure like&lt;a href="http://sourceforge.net/projects/high-scale-lib/"&gt; Cliff Click's Non Blocking Hash Map&lt;/a&gt; would not do well if one used the algorithms without thought in a coherent cluster.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The challenge is that the trade-offs change when you add the latency of a network and data locality in the middle of the game. In normal concurrent data structures you care about:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- How long you hold locks&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- How much is locked while you hold it.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- CPU usage&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- Memory Usage and Object creation&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;In the clustered case you add the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;b&gt;Lock locality&lt;/b&gt; - Is the lock you need already held on the local machine or do you need to go get it over the network. If you need to go get it how long does that take. While a little of the question of "How long does it take to get the lock" exists on a multi-cpu single machine it's not nearly to the same degree.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;b&gt;Data locality&lt;/b&gt; - Is the data I need already local or do I need to go get it. If I need to get it how long does that take&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;b&gt;Data change rate&lt;/b&gt; - How much clustered data am I changing and how long does it take to send it around? Also, do I send it around?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;b&gt;Data size&lt;/b&gt; - In a clustered world one often uses data structures that don't fit entirely in a single node. One has to take pains to control the size and amount of the data in each JVM for efficiency.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are other implementation specific/point in time issues like number of locks and their cost but those can mostly be optimized away at the platform level.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Single JVM ConcurrentHashMap&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ConcurrentHashMap adds concurrency by collecting groups of entries into segments. Those segments are grouped together both from a lock perspective, they share a lock, and from a physical space perspective, all entries in a segment are generally in one collection. In a single JVM the only risk of sharing a lock between the entries is that one can contend on the in-memory speed look-ups. This is a very effective way to handle large numbers of threads making highly contended gets and puts to the map. If one runs into contention with this kind of data structures one can just up the number of segments in the Map. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Concurrent Map In A Clustered World&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In a clustered world problems occur with a data structure like this. First, getting a lock or an object can be either in-memory speed or take many times in-memory speed depending on whether it has recently been accessed locally. In some cases this is no problem and in some cases it's pretty bad. It's also a space issue. If a segment is brought in as a whole and it's entries are in that segment strictly because of it's hashCode then the natural partitioning of the app's usage won't help save space by only loading the entries needed locally. Instead it will load the needed objects and anything else in it's segments. This elimenates the benefits of any natural or forced locality that occurs in a multi-node application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Use-Case Analysis&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In order to highlight some of the pro's and con's of CHM (ConcurrentHashMap) I'm going to vet it against a few use-cases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Use-case 1&lt;/b&gt; - An 8 node app sharing a clustered ConcurrentHashMap&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All the data in the map is read only and it's used in all nodes evenly and the data fits entirely in a single JVM's heap.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;GOOD NEWS! you will be fine with a regular clustered ConcurrentHashMap. Lets look at why.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;1) All data will be loaded everywhere so unnecessary faulting (the act of pulling a data item into a node) won't be happening&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;2) All locks will be read locks and will be local everywhere so your latency will be nice and low (Due to greedy locks)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;3) Won't have contention on the segments because reads are pretty much concurrent&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Use-case 2&lt;/b&gt; - The same as use-case 1 but now the map data is bigger than memory and you have a sticky load balancer.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some good and some bad:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;1) Since data is batched into segments by hash code and your load balancer hashes on something completely different than your map hashes on you will end up loading data into each node that is not needed. This is a result of the ConcurrentHashMap segmenting strategy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;2) Locks will still be fine because it's all read and read locks are very concurrent so segment contention won't be an issue.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So the memory manager may be doing unnecessary work and whether you will be in trouble depends on how big the ConcurrentHashMap is&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Use-case 3&lt;/b&gt; - Same as use-case 2 with the exception that now we are doing 50 percent writes. Something similar to caching conversations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;1) Still have the above problem of loading unneeded batches&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;2) But now, due to the writes, you are also maintaining the state of the objects that have unnecessarily &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;poor locality in all the nodes where they don't belong.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;3) Now you have a locking problem. While writing an entry to a segment you are blocking people in &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;other nodes from reading or writing to that segment adding some serious latency. Plus the locks are &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;getting pulled around to different nodes because even though your load balancer provides locality it is &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;on a different dimension that of the internals of the map and is therefore not helpful.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Reviewing the problems highlighted by use case 3:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; -&lt;/span&gt; Lock hopping leading to slow lock retrieval&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- Lock contention due to grouping of multiple unrelated entries with locks.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; -&lt;/span&gt; Faulting and Memory wasting due to unfortunate segmenting of data&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; -&lt;/span&gt; Broadcasting of changes or invalidations to nodes that shouldn't care&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;What did we do?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We built a specialty highly concurrent map tuned for distribution and the above challenges call ConcurrentDistributedMap.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Locking&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;Instead of breaking things down into segments for locking we lock on the individual keys in the map. This gives the same correctness guarantees while giving the maximum concurrency. This drastically reduces lock hopping and contention and provides in-memory lock speeds most of the time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Segmenting&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;The segments go away completely. Key Value pairs are managed on an individual basis so no unnecessary faulting occurs. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Broadcasting and invalidation:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;The above, plus an efficient memory manager means that values are only faulted into nodes where they are used. Since those values aren't in all nodes anymore invalidation and or broadcasting of changes for those entries is no longer needed. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This data structure takes excellent advantage of any natural partitioning that may occur at the application level.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Summary&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Building a fast, coherent, concurrent, distributed data-structure requires thinking about an extended set of concerns. However, if one pays attention to the issues it is possible to create a highly useful solution.  To learn more check out the ConcurrentDistributedMap described above.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Additional Reading:&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;To learn more about the ConcurrentDistributedMap you can check out these links:&lt;/div&gt;&lt;div&gt;&lt;a href="http://forge.terracotta.org/snapshots/projects/tim-concurrent-collections-root/"&gt;http://forge.terracotta.org/snapshots/projects/tim-concurrent-collections-root/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://forge.terracotta.org/snapshots/projects/tim-concurrent-collections-root/"&gt;&lt;/a&gt;&lt;a href="http://forge.terracotta.org/snapshots/projects/tim-concurrent-collections-root/apidocs/index.html"&gt;http://forge.terracotta.org/snapshots/projects/tim-concurrent-collections-root/apidocs/index.html&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For more information on Terracotta's distributed data structures one can always look here:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.terracotta.org/web/display/docs/Clustered+Data+Structures+Guide"&gt;http://www.terracotta.org/web/display/docs/Clustered+Data+Structures+Guide&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2371737430402185391?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2371737430402185391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2371737430402185391' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2371737430402185391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2371737430402185391'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/08/distributed-data-structures.html' title='Distributed Data Structures: ConcurrentDistributedMap'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-8046758302991654757</id><published>2009-02-24T18:20:00.001-08:00</published><updated>2009-02-24T18:27:35.643-08:00</updated><title type='text'>Micro Review for Safari 4 Beta...</title><content type='html'>I don't know what they are doing as far as tricks but HOLY COW THIS THING IS FAST!. Love the new top sites pane (like chrome), Don't care about the new tabs thing but some may. I thought Safari 3 was really fast. This puts it to shame from a perceived speed point of view. Coverflow for bookmarks is a nice touch and the smart guessing feature in the field where you enter the URL seems to be much better.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Download it now from &lt;a href="http://www.apple.com/safari/download/"&gt;Apple&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-8046758302991654757?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/8046758302991654757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=8046758302991654757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8046758302991654757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8046758302991654757'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/02/micro-review-for-safari-4-beta.html' title='Micro Review for Safari 4 Beta...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-8030161305963751136</id><published>2009-02-06T16:44:00.001-08:00</published><updated>2009-02-10T10:25:43.775-08:00</updated><title type='text'>Maven Is Cooler than you think...</title><content type='html'>I'm sure I'm not the only one who has heard people curse &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;. But Maven is cooler than you think. Back in the day when I wanted to start a project I always had to get a whole bunch of gunk setup before I even wrote a line of code. Especially when trying a new framework or tool. Today I was whipping up a new project for a simple micro-benchmark on some &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; stuff and it reminded me why Maven really can be quite awesome. It took me 10 minutes and about 7 steps. The next time around I won't need to do the installs and then it's 4 steps.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These were the steps I took to get started:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Install &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) Used the &lt;a href="http://forge.terracotta.org/releases/projects/pojo-archetype/docs/quickstart.html"&gt;Pojo Archetype&lt;/a&gt; to create the build and test environment for my project.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- Creates a Mavenized directory structure ready for build, test, run etc. Hooks up to Terracotta maven plugin as well.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- make sure you replace the group id and project id in the command line.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;updated - with the latest eclipse plugin this is unnecessary&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;X &lt;/span&gt;3) In my new project directory type: "mvn eclispe:m2eclipse"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;- This takes your Maven project and readies it for eclipse&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4) Install the &lt;a href="http://m2eclipse.codehaus.org/"&gt;Maven Eclipse Plugin&lt;/a&gt; (I already had eclipse installed)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- Makes dealing with Maven from eclipse much easier&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5) Install &lt;a href="http://www.terracotta.org/web/display/docs/Eclipse+Plugin+Guide#EclipsePluginGuide-Installation"&gt;Terracotta Eclipse Plugin&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- Makes dealing with Terracotta from eclipse much easier&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;6) File-&gt; Import-&gt; Maven projects and import your project into eclipse&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;- Loads up the project directory created from the archetype into Eclipse&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7) Select the project and hit Terracotta-&gt;Add Terracotta Nature&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What you end up with here is a complete project setup ready to be built and tested from both Eclipse and the command line using Maven.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Literally took me about 10 minutes to get started. Notice what you didn't have to do.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Didn't have to build a pom.xml or other kind of build file&lt;/div&gt;&lt;div&gt;2) Didn't have to download or install Terracotta or any of it's pieces&lt;/div&gt;&lt;div&gt;3) Didn't have to think about your directory structures, where you want to put your tests, how you want to run those tests&lt;/div&gt;&lt;div&gt;4) Didn't have to figure out how to do all this stuff in Eclipse or the commandline&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sure, Maven can be challenging at times, but in cases like this, when the vendors have things setup for you, it can be a huge time saver.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;update:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Looks like we've reduced the number of steps to 6 the first time and 3 after that. If we take the guy's idea about auto-applying the Terracotta Nature in archetype we could reduce it to 5 and 2.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-8030161305963751136?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/8030161305963751136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=8030161305963751136' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8030161305963751136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8030161305963751136'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2009/02/maven-is-cooler-than-you-think.html' title='Maven Is Cooler than you think...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2809763705851979394</id><published>2008-11-10T06:32:00.000-08:00</published><updated>2008-12-16T21:59:16.162-08:00</updated><title type='text'>Web 2.0 Scaled Out Reference App...</title><content type='html'>It has struck me that not many good, scaled out, start to finish, Open Source Java reference applications exist for developers to learn from.  Something that can demonstrate a modern and diverse stack of software handling large amounts of users.&lt;br /&gt;&lt;br /&gt;Well check out the &lt;a href="http://www.terracotta.org/web/display/orgsite/Web+App+Reference+Implementation"&gt;Examinator Web Reference App&lt;/a&gt;. It's goal is to demonstrate and document everything from "Build and test" to "Deployment" for a high scale, realistic, web application. It strives to be well written and as simple as possible while still being a good demonstration of best practices. It also strives to document all the relivant pieces so others can learn from it. This is quite a challenge and I'm sure dissagreement will exist on some of the choices. I think it's an excellent start and the right set of goals.&lt;br /&gt;&lt;br /&gt;Here is a taste of the stack and tools:&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; Webflow   &lt;/li&gt;&lt;li&gt;Spring MVC&lt;/li&gt;&lt;li&gt;Sitemesh&lt;/li&gt;&lt;li&gt;Spring&lt;/li&gt;&lt;li&gt;Spring Security&lt;/li&gt;&lt;li&gt;Freemarker&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt;&lt;/li&gt;&lt;li&gt;JPA&lt;/li&gt;&lt;li&gt;Hibernate&lt;/li&gt;&lt;li&gt;Apache DBCP&lt;/li&gt;&lt;li&gt;MySQL&lt;/li&gt;&lt;li&gt;Apache mod_proxy&lt;/li&gt;&lt;li&gt;Tomcat&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mortbay.org/"&gt;Jetty&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Maven &lt;/li&gt;&lt;li&gt;Eclipse (+WTP)&lt;/li&gt;&lt;li&gt;Cargo&lt;/li&gt;&lt;li&gt;JUnit&lt;/li&gt;&lt;li&gt;HttpUnit&lt;/li&gt;&lt;li&gt;Selenium&lt;/li&gt;&lt;li&gt;Crosscheck&lt;/li&gt;&lt;/ul&gt;Click &lt;a href="http://www.terracotta.org/web/display/orgsite/Exam+App+Technologies"&gt;here&lt;/a&gt; to learn more about the choices and why they were made.&lt;br /&gt;&lt;br /&gt;It's pretty good now and I'm pretty sure it's going to get better and better over time so check in early and often. I hope others can learn as much from reading about it and hacking on it as we did writing it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2809763705851979394?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2809763705851979394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2809763705851979394' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2809763705851979394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2809763705851979394'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2008/11/web-20-reference-app.html' title='Web 2.0 Scaled Out Reference App...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-5746105203679572820</id><published>2008-09-24T15:35:00.000-07:00</published><updated>2008-09-24T19:21:07.763-07:00</updated><title type='text'>JVM Wish List</title><content type='html'>I'm sitting at the JVM Summit at Sun for the next few days. It is an interesting group of about 80 people mostly represented by language implementers who target the JVM. Then their are these two guys (me and tim) who work on &lt;a href="http://www.terracotta.org/"&gt;clustering of the JVM&lt;/a&gt;. Seems that our wish list for improvements to the JVM is a bit different than what others here are looking for.  I asked one of the speakers about the proxify stuff below and he shot me down like I was Dick Cheney's pal on a quail hunt. Anyway, what the heck, here's my list.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Proxify&lt;/span&gt; - In Terracotta we dynamically swap objects in and out of the JVM and back to a server in order to create a Virtual Heap. We do this in a way that maintains Object Identity. We rely on a bevy of tricks to do this but it would be much more efficient if we could point to an object (or more than one object) and say proxify (or if a become: call existed we could use that as well, see Smalltalk for more info). All references to the original object would now be pointing to a light weight proxy. If someone touches the thing we would then inflate it back to being a full fledged object.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Array Instrumentation&lt;/span&gt; - Currently we instrument arrays in java by instrumenting the classes that reference the array. This is a bit messy and expensive and forces us to instrument classes that we might not otherwise need to. It also forces us to do more magic than I like to associate a shadow object with the array. Would be great if we could make this go away.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Native Method Replacement - &lt;/span&gt;When we want to muck with things like System.arraycopy we can't just wrap and replace because native methods get unhappy with that approach. So we have to replace at the caller. Would be nice if we didn't have to do that as much like arrays this is messy and forces us to instrument extra classes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;JVM support for meta-level monitoring of objects and code&lt;/span&gt; - This is not a new idea but it would be simpler and more efficient if we could ask the jvm to callback on us when things like field changes, lock acquires, field accesses occur on objects we care about. Would also be cool if we could associate meta-data with an instance (shadow objects) and ask for stats on a live instance (for our memory manager to make really good decisions on when to proxify). We do all these things now but they are complicated and more expensive then they need to be because we do them at the JRE level.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Good Hot swapping - &lt;/span&gt;If we can't have any of the above, good Hot swapping would also make things easier. We could decide what to instrument on the fly to simplify config a little bit and it would enable some optimizations that are very difficult to do now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Solve the Int Size Problem&lt;/span&gt; - Currently arrays and all collections in Java are sized by an integer. As JVM's go more and more 64bit and people start creating collections larger than a couple billion in size it sure would be nice if they didn't bump up against this limitation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's it, my quick and dirty brainstormed wish list. Maybe some JVM fairy God Mother will some day grant me three wishes and bring some of these to reality.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-5746105203679572820?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/5746105203679572820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=5746105203679572820' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/5746105203679572820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/5746105203679572820'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2008/09/jvm-wish-list.html' title='JVM Wish List'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-439437025831679598</id><published>2008-05-08T09:34:00.000-07:00</published><updated>2008-05-08T09:57:17.622-07:00</updated><title type='text'>Who's Serious About Search...</title><content type='html'>I was chatting with someone from Yahoo last night and I mentioned that while I use Yahoo as my home page and e-mail I almost always search on Google. I never gave it much thought but a reason must exist for this to be true. I remember a LONG time ago Google had better search results and that's why I used it. I suspect that little difference exists now. So, why?&lt;br /&gt;&lt;br /&gt;My theory is that it has little to do with the search itself and everything to do with two things:&lt;br /&gt;&lt;br /&gt;1) Accessibility - By far the biggest reason I use Google is because it is just flat out the easiest search to get to. It is in my tool bar on both safari and firefox on my desk and in my phone. Yes I know that the others are in there too but... Does anyone actually change from the default?&lt;br /&gt;&lt;br /&gt;Question:&lt;br /&gt;If Yahoo and others are serious about search how can they hand this slot that is SO important to Google?&lt;br /&gt;&lt;br /&gt;A second part of accessibility is more subtle. Go to www.google.com and www.yahoo.com. On Google's site search is what you see. It is the only thing on the page aside from some fine print. This screams "I care about search". On Yahoo's site the page is so busy you barely notice search.&lt;br /&gt;&lt;br /&gt;2) Marketing - Google managed to get people to refer to searching as Googling! Need I say more. Does anyone even know of another name for a Band-Aid?&lt;br /&gt;&lt;br /&gt;A couple of side points. I like yahoo's home page (old not new) a lot. I actually like yahoo's e-mail better than Googles. It is entirely possible that they have intentionally taken a more balanced approach to the web and not focused on being number one in search. I have no idea. But... if someone wants to take on Google in a serious way, be RIGHT THERE when I want you. On my IPhone, on my desktop, in my browser. I don't "think" about search. It's a tool and I mostly grab the one near my hand that fits the general problem I'm trying to solve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-439437025831679598?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/439437025831679598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=439437025831679598' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/439437025831679598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/439437025831679598'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2008/05/whos-serious-about-search.html' title='Who&apos;s Serious About Search...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2007866029076852881</id><published>2008-05-06T13:50:00.000-07:00</published><updated>2008-05-06T14:24:19.419-07:00</updated><title type='text'>An Optimization For Garbage Collectors...</title><content type='html'>For the last few days I have been thinking a lot about GC as &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; moves towards our first major rewrite of that subsystem. Lots of relatively large changes have been bouncing around in my head as I &lt;a href="http://citeseer.ist.psu.edu/bjornerstedt90secondary.html"&gt;read papers&lt;/a&gt;, &lt;a href="http://useless-factor.blogspot.com/"&gt;blogs&lt;/a&gt; and talk to people. Maybe I'll blog about those later but one pretty simple one occurred to me. I have a theory that &lt;span style="font-style: italic;"&gt;most&lt;/span&gt; Shared Objects are actually only directly referenced by one parent object (I haven't run stats on this yet so I might be full of it).  I started from wondering whether we could take advantage of this  to improve the efficiency of GC. Here is what I came up with:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; We can keep a Set of Object ID's for objects that only have one direct reference to it. We have an implementation of a compressed Set of ID's so this can be quite space efficient.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; If an Object gets a second reference to it then it is removed from that Set&lt;/li&gt;&lt;li&gt; If that one reference is removed and in the Terracotta world that object is not reachable from a client or in a non-terracotta world it is not reachable from the stack then the object is garbage.&lt;/li&gt;&lt;li&gt;If an Object has no references but is reachable from the stack or is still on a client then add it to the no-refs Set so that when those two things are no longer true they can be marked as garbage or if the object is re-referenced it can be accounted for properly.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; You can also recurse through the objects that the new garbage object referenced doing the same check.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;One might be wondering, "Does steve think he just invented reference counting?" Nope, I don't and I haven't decided if this idea is any better than just having a first phase of garbage collection based solely on reference counting. I'm just theorizing that it might be. I don't even know that I invented this shortcut. Most real world GC's are hybrids of multiple approaches that best fit the set of restrictions and limitations faced in the environment. This one seems like it could improve things significantly in real world apps and potentially drastically reduce the required frequency of full GC's in our world without adding too much overhead.&lt;br /&gt;&lt;br /&gt;Anyway, blast away :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2007866029076852881?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2007866029076852881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2007866029076852881' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2007866029076852881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2007866029076852881'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2008/05/optimization-for-garbage-collectors.html' title='An Optimization For Garbage Collectors...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4066915628773304160</id><published>2008-04-24T09:55:00.000-07:00</published><updated>2011-09-01T14:51:36.356-07:00</updated><title type='text'>More Advice To A Young Developer...</title><content type='html'>I read Alex Miller's blog post on &lt;a href="http://tech.puredanger.com/2008/04/20/advice-to-a-young-developer/"&gt;"Advice To A Young Developer"&lt;/a&gt; and it got me thinking. What general advice would I give to young developers. I came up with a few things. Hopefully they will help somebody.&lt;br /&gt;&lt;br /&gt;1) &lt;span style="font-weight: bold;"&gt;Become your best by NOT being the best &lt;/span&gt;- This may seem obvious but the best way to be your best is to put your self in positions where your surrounded by people who are better than you on at least one dimension. This leads to point number 2.&lt;br /&gt;&lt;br /&gt;2) &lt;span style="font-weight: bold;"&gt;Listen more than you talk&lt;/span&gt; - Use a bit of insecurity and a bit of wanting to be the best to drive you to suck the knowledge and experience from the people around you. Even the people you may view as less than you on some dimension or another will still teach you things if you listen. While your talking you are NOT listening.&lt;br /&gt;&lt;br /&gt;3) &lt;span style="font-weight: bold;"&gt;Be Stupid, Stupid!&lt;/span&gt; - Sometimes being smart is a smart person's worst enemy. Don't ever use your intelligence as a crutch. Do research, talk to people, listen to people, read code, read books. In short allow yourself to evolve or risk not knowing how bad you are at things that you could have been great at. Watch out if you find yourself doing things from first principles all the time.&lt;br /&gt;&lt;br /&gt;4) &lt;span style="font-weight: bold;"&gt;Slow Down -&lt;/span&gt; Of course a developer should work ones ass off. Almost all of the good ones do. But allow yourself time to think. Step back and look at what you are doing. In software it is very easy to rat hole on the wrong thing so take brakes, think, and get back to it. No more than 50 percent of your time should be spent typing (I actually think for an experienced dev it should be more like 25 percent).&lt;br /&gt;&lt;br /&gt;5) &lt;span style="font-weight: bold;"&gt;Be A Tester&lt;/span&gt; - This is really for all Software Engineers, but... Be a tester, learn to write great automated tests that exercise at the unit, component, and system level. NOTE: This doesn't mean write tons and tons of tests. It means learn to write good ones.&lt;br /&gt;&lt;br /&gt;6) &lt;span style="font-weight: bold;"&gt;Read your code&lt;/span&gt; - Software is complicated. Go back and read your code. You'll find all kinds of interesting things&lt;br /&gt;&lt;br /&gt;7) &lt;span style="font-weight: bold;"&gt;Refactor -&lt;/span&gt; Refactor your code for readability, testability and maintainability.  A myth exists that doing something in a messy poorly organized way is somehow quicker than doing it in a clean way. This is flat out untrue. I've actually timed myself. It takes longer to do things poorly. You are not saving any time by leaving bad code around. If it's a state machine write it as a clean well factored state machine. If you see a ton of nested if's  extract methods, use null objects, what ever is needed.&lt;br /&gt;&lt;br /&gt;8) &lt;span style="font-weight: bold;"&gt;Don't Guess&lt;/span&gt; - I first started with don't pre-optimize but I figured I would go one step further. Don't Guess! Write tests to show a perf problem before fixing them, don't guess about what features will be needed in the future, don't guess about whether your change fixes a bug. PROVE IT!&lt;br /&gt;&lt;br /&gt;9) &lt;span style="font-weight: bold;"&gt;Trust Me - &lt;/span&gt;If you find yourself trying to win an argument by saying "trust me, I've done this or that before", or "I just know" then STOP. If you can't explain your point then you probably don't really have one so either figure out what the point really is or just admit your wrong.&lt;br /&gt;&lt;br /&gt;10) &lt;span style="font-weight: bold;"&gt;Wishful thinking &lt;/span&gt;- Any decent list always has 10 items in it right? Anyway program by &lt;a href="http://dsoguy.blogspot.com/2007/01/programming-by-wishful-thinking.html"&gt;wishful thinking&lt;/a&gt;. Keeps you focused.&lt;br /&gt;&lt;br /&gt;Reading back on this list it is completely all over the place. I have like 50 more ideas but this blog is already kind of preachy and pedantic so I'll stop :-). Hope someone can find some benefit from it.&lt;br /&gt;&lt;br /&gt;Anyone else have ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4066915628773304160?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4066915628773304160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4066915628773304160' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4066915628773304160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4066915628773304160'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2008/04/more-advice-to-young-developer.html' title='More Advice To A Young Developer...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4974539922918404927</id><published>2008-01-30T13:13:00.001-08:00</published><updated>2008-01-30T13:45:29.752-08:00</updated><title type='text'>The New "My Yahoo" Homepage</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rOeRnnmMxi0/R6DtJLpVXSI/AAAAAAAAAAs/4OVQR10-J84/s1600-h/new_yahoo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_rOeRnnmMxi0/R6DtJLpVXSI/AAAAAAAAAAs/4OVQR10-J84/s320/new_yahoo.jpg" alt="" id="BLOGGER_PHOTO_ID_5161385914967350562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_rOeRnnmMxi0/R6DtCLpVXRI/AAAAAAAAAAk/-0Y5yPwQwRg/s1600-h/old_yahoo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_rOeRnnmMxi0/R6DtCLpVXRI/AAAAAAAAAAk/-0Y5yPwQwRg/s320/old_yahoo.jpg" alt="" id="BLOGGER_PHOTO_ID_5161385794708266258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have used my.yahoo.com as my home page for a long time. Here are my comments on the new version they are pushing lately.&lt;br /&gt;&lt;br /&gt;- I'm not thrilled with the giant square advertisement in the upper left and most important space on the page. You can move it to the right side with the layout control but it still isn't my favorite. It's giant, square and flashy and for me a bit annoying as compared to the old layout.&lt;br /&gt;&lt;br /&gt;- The left side blocks are too wide. I like to glance at that stuff but it doesn't have a lot of text and tends to not need the extra width. It is about 50 percent wider than it was in the old version.&lt;br /&gt;&lt;br /&gt;- I like the idea of the personal assistant thing. It has mail, stocks and some less useful stuff in a very useful spot. My problem with it is that it grows on hover. Things that take major actions on hover kind of bug me. Mostly they just make me do the action by accident and add no real value.&lt;br /&gt;&lt;br /&gt;- I'm not sure if it's a bigger font or more white space but it feels like I have to do a lot more scrolling to see my rss feeds.&lt;br /&gt;&lt;br /&gt;Fear not, it's not all bad, the personalization stuff while lacking enough control is visually pleasing and trivial to use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4974539922918404927?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4974539922918404927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4974539922918404927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4974539922918404927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4974539922918404927'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2008/01/new-my-yahoo-home-age.html' title='The New &quot;My Yahoo&quot; Homepage'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_rOeRnnmMxi0/R6DtJLpVXSI/AAAAAAAAAAs/4OVQR10-J84/s72-c/new_yahoo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-527102177041203753</id><published>2008-01-28T13:08:00.000-08:00</published><updated>2008-01-28T13:26:42.815-08:00</updated><title type='text'>DZone Suggestion, More Comments</title><content type='html'>I like &lt;a href="http://dzone.com/"&gt;DZone&lt;/a&gt; a lot. I read it regularly and post to it when practical. I like the rising links, I like the popular links, I even like the voting system. However, one thing that would make DZone just a touch better is to encourage people to comment on blogs when they vote. I personally learn from both the positive and negative feedback and anything that can be done to encourage that feedback is welcome. So, my suggestion is to pop up an optional "Add comment" field with proceed and cancel options after any vote on DZone. Anyone is free to not comment at that point but if someone has something on the tip of their tongue they might be more likely to say it. Our experience at &lt;a href="http://www.terracotta.org"&gt;Terracotta&lt;/a&gt; in building our .org website tells us that even subtle changes can have a broad impact on what people do. I would be interested to see this A/B tested and see if it increases comment volume.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-527102177041203753?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/527102177041203753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=527102177041203753' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/527102177041203753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/527102177041203753'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2008/01/dzone-suggestion-more-comments.html' title='DZone Suggestion, More Comments'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-7838536131519500725</id><published>2008-01-24T22:16:00.000-08:00</published><updated>2008-01-25T10:48:34.439-08:00</updated><title type='text'>Why I love and hate statics in Java</title><content type='html'>I was chatting with some fellow &lt;a href="http://www.terracotta.org"&gt;geeks&lt;/a&gt; earlier this evening and it occurred to me that I've said to people that they should almost ALWAYS use static and also told people they should almost NEVER use static. Am I schizophrenic, a hypocrite, or just dumb. Maybe all three but it has nothing to do with this blog. I'm talking about two different language usages of the static reserved word.&lt;br /&gt;&lt;br /&gt;USAGE 1, where the love is:&lt;br /&gt;Inner classes. I hate non-static inner classes. IMHO non-static inner-class is unnecessary syntactic sugar that leads to hard to read code and subtle bugs. For those who don't know, non-static inner classes maintain a hidden instance variable holding a parent instance. It then uses specially generated methods to give access to the parent's private fields and auto-magically calls methods on the parent if no local method of the used name exists. I've seen this lead to memory leaks (people passing around instances of inner classes and not realizing that they are keeping around parents), all kinds of confusing issues with methods of the same name in inner and outer classes and variable problems of the like. On the occasions I use inner classes I almost always go with the static kind.&lt;br /&gt;&lt;br /&gt;USAGE 2, no love here:&lt;br /&gt;Static variables. With the exception of constants I have a strong dislike of static variables. Why you ask? When used to create various versions of singletons it leads to messy hidden code dependencies . It also makes it hard to do mock object stuff for testing, creates hidden initialization stuff and makes it difficult to create multiple environments in a single JVM. Just darn inflexible for no gain. I would go into details but this has been covered quite nicely &lt;a href="http://tech.puredanger.com/2007/07/03/pattern-hate-singleton/"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Anyway, in summary, STATIC inner classes good, STATIC variables bad.&lt;br /&gt;Goodnight ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-7838536131519500725?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/7838536131519500725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=7838536131519500725' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7838536131519500725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7838536131519500725'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2008/01/why-i-love-and-hate-statics-in-java.html' title='Why I love and hate statics in Java'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2702153999486645451</id><published>2007-12-19T20:00:00.000-08:00</published><updated>2007-12-19T20:06:00.227-08:00</updated><title type='text'>Saved by a Time Machine...</title><content type='html'>In the last 4 months I have had the good fortune of twice having my hard drive crash on me on my Macbook Pro. The first time I lost of bunch of stuff but was lucky to be able to recover some data off of various other machines. This last time I was saved by Time Machine. I'll be taking my computer to the apple store tonight for another hard drive replacement but I already have access to all my files. I just connected my backup drive to my wife's mac and clicked the time machine button. Selected use previous configuration, and I was able to recover some of the directories and files I needed to her machine. It was very simple and effective. So for those of you who have had lousy backup experiences and have given up. I recommend giving it another try with time machine. It bailed me out this time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2702153999486645451?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2702153999486645451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2702153999486645451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2702153999486645451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2702153999486645451'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/12/saved-by-time-machine.html' title='Saved by a Time Machine...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-971627812133451691</id><published>2007-11-28T00:26:00.000-08:00</published><updated>2007-11-28T00:30:38.991-08:00</updated><title type='text'>First experiment with JDK 1.6 on OS X</title><content type='html'>Ran into this article on &lt;a href="http://apple.slashdot.org/article.pl?sid=07/11/27/1547212&amp;amp;from=rss"&gt;JDK 1.6 on OS X&lt;/a&gt; from slashdot. I figured I would give it a whirl with &lt;a href="http://www.terracotta.org"&gt;Terracotta&lt;/a&gt; as an experiment. Turns out I just needed to hack the Terracotta OS version check in the ./common/src/com/tc/util/VendorVmSignature.java class because this jvm calls the OS Darwin instead of osx and then things just worked. Was kind of odd to see the JTable demo come up as an X window but things worked like a charm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-971627812133451691?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/971627812133451691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=971627812133451691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/971627812133451691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/971627812133451691'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/11/first-experiment-with-jdk-16-on-os-x.html' title='First experiment with JDK 1.6 on OS X'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-271320735750473323</id><published>2007-10-28T09:38:00.000-07:00</published><updated>2007-10-29T13:25:05.999-07:00</updated><title type='text'>Using Web Clipping to Monitor DZone</title><content type='html'>Now that I've installed Leopard I figured I would try out a few of it's new fea&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_rOeRnnmMxi0/RyY_4h-25TI/AAAAAAAAAAc/Jc5IHvG43RA/s1600-h/dzone-pic.jpg"&gt;&lt;img style="margin: 20px 20px 20px 0pt; float: left; cursor: pointer; width: 239px; height: 264px;" src="http://bp0.blogger.com/_rOeRnnmMxi0/RyY_4h-25TI/AAAAAAAAAAc/Jc5IHvG43RA/s320/dzone-pic.jpg" alt="" id="BLOGGER_PHOTO_ID_5126855466235127090" border="0" /&gt;&lt;/a&gt;tures. At first I didn't really get this new Web clip button on Safari. Turns out, it's really kind of useful. It allows one to choose a piece of a web page and auto magically turn it into a widget.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I like DZone's little rising links section on the top left of the home page so I thought I would try it out on that. It's pretty much so easy that even the least technical person should be able to handle this. Here are the steps:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go to the web page that has a part that you like to watch. Some examples might be my.yahoo.com or dzone.com (the one I chose)&lt;/li&gt;&lt;li&gt;Click on the button in the top bar of your web browser that looks&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_rOeRnnmMxi0/RyUjWB-25SI/AAAAAAAAAAU/OwIg-SU7KTA/s1600-h/webclip.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: right; cursor: pointer;" src="http://bp1.blogger.com/_rOeRnnmMxi0/RyUjWB-25SI/AAAAAAAAAAU/OwIg-SU7KTA/s320/webclip.jpg" alt="" id="BLOGGER_PHOTO_ID_5126542612227351842" border="0" /&gt;&lt;/a&gt; like a pair of scissors and a dotted rectangle. Should be  between the refresh button and the add link button.&lt;/li&gt;&lt;li&gt;Move your mouse around and see what clips get highlighted. When one you want to use as a widget is highlighted just click on it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Towards the upper right click the "add" button if you like what you have selected and you are done.&lt;/li&gt;&lt;li&gt;Now, when you go to your widgets it will be there and refreshed every time.&lt;/li&gt;&lt;/ol&gt;Enjoy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-271320735750473323?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/271320735750473323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=271320735750473323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/271320735750473323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/271320735750473323'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/10/using-web-clipping-to-monitor-dzone.html' title='Using Web Clipping to Monitor DZone'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_rOeRnnmMxi0/RyY_4h-25TI/AAAAAAAAAAc/Jc5IHvG43RA/s72-c/dzone-pic.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-3266120529932525870</id><published>2007-10-28T09:19:00.000-07:00</published><updated>2007-10-28T09:35:56.218-07:00</updated><title type='text'>No Java, Bye Bye Macbook Pro's...</title><content type='html'>I have liked Mac's for as long as they have had OS X, didn't like them before that. Over 50 percent our  Development/Field Eng team, have a mac. I've been accused of being an Apple fan boy on a few occasions. Unfortunately Apple is backing us into a corner. We develop &lt;a href="http://www.terracotta.org"&gt;Java infrastructure software&lt;/a&gt; and if Apple isn't going to take JVM on OS X seriously we will have to move off the platform.&lt;br /&gt;&lt;br /&gt;http://www.cio.com/article/149200&lt;br /&gt;&lt;br /&gt;http://javablog.co.uk/2007/10/26/apple-os-x-leopard-doesnt-have-java-6/&lt;br /&gt;&lt;br /&gt;This would be very unfortunate for me, since I like my Macbook Pro, my team, because they like theirs and for Apple itself because we will stop spending thousands of dollars a year on Apple hardware. Hopefully they resolve this issue as I will be unable to purchase more Macs if this situation doesn't get resolved soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-3266120529932525870?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/3266120529932525870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=3266120529932525870' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3266120529932525870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3266120529932525870'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/10/no-java-bye-bye-macbook-pros.html' title='No Java, Bye Bye Macbook Pro&apos;s...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2627721083566980884</id><published>2007-09-21T19:36:00.000-07:00</published><updated>2007-09-21T19:46:42.113-07:00</updated><title type='text'>Goodbye Randy Pausch</title><content type='html'>Don't need to be a geek to learn from this one. One of the best CS professors I ever had is going too pass in the next month or so at the way to young age of 46. He has inoperable pancreatic cancer. For those who had the luck to have met or learned from him and for those who have not, this is his must see last lecture.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cmu.edu/uls/journeys/"&gt;The Lecture&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=ZQtwEKlUutA"&gt;WSJ piece on him&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also check out some of his projects:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.alice.org/"&gt;Alice&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.alice.org/stage3/pubs.html"&gt;A bunch of his papers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My best to his family and friends and may his legacy live on. I only wish I could take one more class with you at the helm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2627721083566980884?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2627721083566980884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2627721083566980884' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2627721083566980884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2627721083566980884'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/09/goodbye-randy-pausch.html' title='Goodbye Randy Pausch'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-8593904570615300457</id><published>2007-09-10T22:07:00.001-07:00</published><updated>2007-09-14T19:33:19.447-07:00</updated><title type='text'>3.5 Rules in Distributed Algorithm Design</title><content type='html'>In highly concurrent distributed computing their are all kinds of algorithms one can learn. One can read books like &lt;a href="http://www.amazon.com/gp/product/047143230X/002-3779797-2501652"&gt;Concurrent and Distributed Programming in Java&lt;/a&gt; and &lt;a href="http://www.amazon.com/gp/product/0132392275/002-3779797-2501652"&gt;Distributed Systems: Principles and Paradigms&lt;/a&gt;. One can learn how to write scalable servers by reading things like these papers on &lt;a href="http://www.eecs.harvard.edu/%7Emdw/proj/seda/"&gt;SEDA&lt;/a&gt;. But when creating a distributed algorithm their are 3 simple Goals/Rules you need to follow. While these rules were developed with the &lt;a href="http://www.blogger.com/www.terracotta.org"&gt;Terracotta&lt;/a&gt; approach in mind they are mostly applicable to any distributed computing approach:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use algorithms that allow for maximum concurrency&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Seems obvious but design your algorithm to allow maximum concurrency. In a single JVM concurrency is important. In a distributed environment where lock acquire and release is almost certainly more expensive it is that much more important&lt;/li&gt;&lt;li&gt;Use read locks where possible. If you can have multiple readers look at something, duh, don't stop them.&lt;/li&gt;&lt;li&gt;Try strategies like striping, lock on fine grained objects etc (this is some of what concurrent hash maps do).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Minimize chatter&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Many really cool concurrent algorithms are less good for distributed computing because of the amount of chatter (data that needs to be communicated between nodes).&lt;/li&gt;&lt;li&gt;Algorithms that require too much cross node book keeping are a problem. Networks are slow and relatively thin pipes. Chattiness plays into that weakness and can also eat cpu.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt; Take advantage of locality of reference&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Use algorithms that partition well&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Use algorithms that can mostly or entirely act on local data.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Scale-out architectures don't have all the data everywhere. They rely on various levels of caching both near and far for optimal performance. When hitting data try to hit data in the same node where possible.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Rule 3.5 exists as well. Remember not to guess at the performance of something. Test it, time it and automate as much as possible of those tests and timings.&lt;br /&gt;&lt;br /&gt;This has been a public service announcement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-8593904570615300457?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/8593904570615300457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=8593904570615300457' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8593904570615300457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/8593904570615300457'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/09/3-simple-rules-in-distributed-algorithm.html' title='3.5 Rules in Distributed Algorithm Design'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-5820633557062428219</id><published>2007-07-29T23:03:00.000-07:00</published><updated>2007-07-31T09:46:20.864-07:00</updated><title type='text'>E-mail Sucks!</title><content type='html'>E-mail is absolutely an awful way to communicate with people. &lt;a href="http://orionl.blogspot.com/"&gt;Orion&lt;/a&gt;, who works with me at &lt;a href="http://www.terracotta.org"&gt;Terracotta&lt;/a&gt;, and I joke about this all the time. More lost information, mistakes, fights and miscommunication can be attributed to e-mail than almost any other cause I can think of.  Here are a few of the problems with email communication that I’ve noticed over the years:&lt;br /&gt;  &lt;br /&gt;  1. It is almost impossible to properly convey emotion in e-mail (so don't try).&lt;br /&gt;   2. Most people only skim e-mails because they get so damn many of them&lt;br /&gt;   3. E-mail is slow and problematic for conversations&lt;br /&gt;   4. E-mail is permanent.&lt;br /&gt;&lt;br /&gt;Solution:&lt;br /&gt;&lt;br /&gt;Here are some rules that I try (and fail sometimes) to follow.&lt;br /&gt;&lt;br /&gt;   1. Never try to express anything but the simplest of emotions via e-mail. You can't see the persons face, or even make judgments based on communication pauses or tone. So don't send emotion in e-mail.&lt;br /&gt;   2. Don't send e-mail if you are angry. (&lt;a href="http://tech.puredanger.com/"&gt;Alex miller&lt;/a&gt; pointed out that it is often helpful to write the angry e-mail but not send it. It's a good way to vent). Always make your e-mail twice as positive and/or emotionless as you think you need to. As they say on dragnet: Just the facts ma’am.&lt;br /&gt;   3. Don't assume that your e-mail was read. How many times have you heard, "But I sent an e-mail." Doesn't mean squat. Check in with people on chat, drop by, or call and make sure that they got/understood your e-mail. If you didn't get an ack (geek for response), you should assume that they didn't get it. Let me say it again. Don't ever defend yourself with "I sent an e-mail"&lt;br /&gt;   4. If you want to have a conversation, use a synchronous communication mechanism like chat, irc, talk in person or on the phone. E-mail is strictly good for relaying facts (and not even very good for that because they get lost in the ton of other e-mails you have. Try a wiki for facts).&lt;br /&gt;   5. If you send a dumb e-mail be assured that the receiving person has passed it around to a few friends to get a laugh or opinion. It is a permanent record of your stupidity (kind of like this blog is for me). So don't say anything in e-mail that you don't want to see on the cover of the NY times.&lt;br /&gt;&lt;br /&gt;I must admit that I learned some of the above the hard way. I assume most people have received an e-mail that made their blood boil. You’re just dying to write up a response outlining what a jerk someone is. Well don't do it!&lt;br /&gt;&lt;br /&gt;The thing to keep in mind is that there are a million ways to get yourself into trouble with email, but you almost never get yourself into trouble by NOT sending one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-5820633557062428219?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/5820633557062428219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=5820633557062428219' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/5820633557062428219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/5820633557062428219'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/07/e-mail-sucks.html' title='E-mail Sucks!'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-1608862360314347558</id><published>2007-07-21T08:09:00.000-07:00</published><updated>2007-07-31T23:26:35.362-07:00</updated><title type='text'>A Job building Terracotta</title><content type='html'>Opportunistic would be the best way to describe our hiring style at &lt;a href="http://www.blogger.com/www.terracotta.org"&gt;Terracotta&lt;/a&gt;. We always have our eyes open for the super sharp so I figured I would post about what we generally look for and see if anyone out there shows up to make more magic happen for us. I talked a bit about what I think people should look for when hiring in my blog on &lt;a href="http://dsoguy.blogspot.com/2007/05/teams-starts-with-people.html"&gt;teams&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Passionate&lt;/span&gt; - Do you actually love having complex problems to solve. Can you not sleep at night thinking about how best to design, factor, improve software. Are you always striving for improvement and learning.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Knowledgeable&lt;/span&gt; - I'm not going to list a bunch of frameworks here. The knowledge we mostly look for is about knowing how to solve tough problems. The one thing that is a must is you must know multi-threaded programming. Having experience building some kind of infrastructure software is a big plus. Whether it's building an App server, a database or jms system isn't so important but knowing how to build things that need to be scalable is a big plus (just to be clear, not using those things, building them). For some of our stuff knowing classloaders cold and byte code manipulation is a big plus as well. Most of all you must love and be good at writing software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Respect/Teamwork&lt;/span&gt; - This is complex stuff and we are not a big company so you need to be able to talk to and work with others. No room for people who are pedantic and or self serving. It has to be about the product and the software for you not the title. This is true no matter what role you are looking at filling.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Judgement - &lt;/span&gt;Each person has to have excellent judgment. Must be able to focus on what's important. If you don't know something, that's not a problem but communicate, ask questions don't rat hole and don't hide problems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intelligence&lt;/span&gt; - Not going to lie. You must be smart. You should be a person who can analyze and design complex algorithms. Debug and solve complex problems. We will ask you to answer algorithm questions and write some code in the interview.&lt;br /&gt;&lt;br /&gt;I know that's a pretty tough list but if you think what we do is cool and fit most of that please shoot your resume to careers at terracottatech dot com.&lt;br /&gt;&lt;br /&gt;For those who don't already know about Terracotta here is a brief overview:&lt;br /&gt;&lt;br /&gt;We are a well funded startup based in San Francisco but with developers all over the world. Our product is open source network attached memory for Java and is probably the most interesting and diverse product one could work on stretching from distributed computing, to byte code manipulation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-1608862360314347558?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/1608862360314347558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=1608862360314347558' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1608862360314347558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1608862360314347558'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/07/job-building-terracotta.html' title='A Job building Terracotta'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-1350096440013044469</id><published>2007-07-19T14:19:00.000-07:00</published><updated>2007-07-19T14:31:26.737-07:00</updated><title type='text'>What were those results again?</title><content type='html'>This is a small follow up to my blogs about &lt;a href="http://dsoguy.blogspot.com/2007/07/more-lies-distributed-performance.html"&gt;anti-patterns&lt;/a&gt;. When trying to debug a complex logic or performance problem one of the most important things one can do is take notes. I had a conversation with someone the other day where the person said, "I'm in a rush, I don't have time to take notes about my runs." To this I replied, you don't have time not too.&lt;br /&gt;&lt;br /&gt;So often we are in such a rush to solve a problem that we cut the wrong corners. When performance tuning, and/or tracking something down that requires multiple runs or configurations of your software always always always take notes on each run. They don't have to be super formal but you should write down all the details you can think of. Some examples include, what were my settings, what did the cpu usage/machine stats look like. What problems  did I  run into. Always keep  a date/time stamp on the tests. This will prevent the inevitable rerunning of tests because you forgot the results, or mixing up what you have tried and not tried. It only takes one mistake to use up more time than tons of note taking would require.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-1350096440013044469?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/1350096440013044469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=1350096440013044469' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1350096440013044469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1350096440013044469'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/07/what-were-those-results-again.html' title='What were those results again?'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-388152304910641818</id><published>2007-07-13T13:11:00.000-07:00</published><updated>2011-04-17T18:53:56.712-07:00</updated><title type='text'>What do I do when my iPhone gets hot?</title><content type='html'>This will be a quick one. Since the gang at &lt;a href="http://www.blogger.com/www.terracotta.org"&gt;Terracotta&lt;/a&gt; has about about 5 &lt;a href="http://www.iphone.com/"&gt;iPhone&lt;/a&gt; users, I've had a few people ask me what to do when an iphone starts to get hot or the battery seems to be draining to fast. This is usually an indication of a rogue app. Same thing sometimes happens on my notebook. On my notebook I usually run the Activity Monitor and then kill the process that is using a bunch of cpu. On the iphone you just have to make an educated guess which app is the problem. It's usually the web browser or Mail for me.&lt;br /&gt;&lt;br /&gt;Just hold the home key (The only button on the front of the phone) for 10 seconds with the app you want to kill open and it will get restarted. That will do the trick. This should lead to longer battery life and a cooler phone.&lt;br /&gt;&lt;br /&gt;Good luck&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UPDATED 4/29/2010:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I've noticed a number of people still hit this blog. I'm pretty sure that iphones now use that home button for screen capturing and the above advice won't help anymore. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So here is what to do now:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From the 3g on the thing to do is restart your iPhone by:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Hold down the power button (top of the phone) until the slider comes up asking you if your sure you want to shutdown (This can take about 10 seconds). &lt;/li&gt;&lt;li&gt;Just slide it to say yes and wait while it shuts down.&lt;/li&gt;&lt;li&gt;When it's done shutting down push the power button again to start up again. &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Everything should work better now and the heat should dissipate. Good luck!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-388152304910641818?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/388152304910641818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=388152304910641818' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/388152304910641818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/388152304910641818'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/07/what-do-i-do-when-my-iphone-gets-hot.html' title='What do I do when my iPhone gets hot?'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-3843872443449101720</id><published>2007-07-13T12:36:00.000-07:00</published><updated>2007-07-13T12:57:51.211-07:00</updated><title type='text'>More Lies - Distributed Performance Testing Anti-patterns Part 3 of 4</title><content type='html'>In part 3 out of 4 of this blog, much like &lt;a href="http://dsoguy.blogspot.com/2007/06/why-your-distributed-tests-are-lying-to.html"&gt;parts 1&lt;/a&gt; and &lt;a href="http://dsoguy.blogspot.com/2007/07/distributed-performance-testing-anti.html"&gt;2&lt;/a&gt; I will hit on anti-patterns that allow your performance testing of clustered and or distributed software to lie to you. I'll be following up part 3 of this blog, the last 4 anti-patterns, with a blog about a simple distributed testing framework I have begun. Hopefully enough of you will be interested, try it and maybe even contribute to it.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Anti-pattern 7:&lt;/span&gt; In-memory vs. Distributed Performance Comparison&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Writing a test that compares the speed of adding objects to a local, in-memory data structure vs. adding objects to a clustered data structure.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To avoid suspense, I'll tell you the results of that test without running it. Adding things to a local, in-memory data structure stakes virtually no time at all. In-memory object changes happen so fast, they are hard to even measure. However, when you are making changes to a distributed data structure, no matter what, those state changes have to be shipped off to another location. This takes instructions to be executed to make this happen on top of the ones used for the original task. This isn't just slower, it is way slower. The comparison between in-memory object changes and distributed object changes is useless.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Figure out how much data you are going to be clustering and what the usage patterns of that data becoming clustered will be. Then simulate and time that. Once again, focus on total throughput with acceptable latency.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anti-pattern 8: &lt;/span&gt;Ignore Real-world Cross-node Patterns&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reading and writing the same data in every node.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Generally speaking, whether reading or writing, it is more expensive to access the same data concurrently across all nodes. Depending on the underlying clustering infrastructure, this can be more or less of a problem. If you are using an “everything everywhere” strategy, the performance hit of random access across all the data on all the nodes is less, but the “everything everywhere” sharing strategy generally does not scale well. Most other strategies perform better when data access is consistently read and or written from the same node&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Write your performance tests in a way that allows you to set a percentage for locality of reference. Is an object accessed on the same node 80%, 90%, or 99% of the time? You should usually have some cross-node chatter, but usually not too much—although you should be as realistic to the problem you are trying to solve as possible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anti-pattern 9:&lt;/span&gt; Ignore Usage Patterns&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The performance test either just creates objects or just reads objects&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the real world, an application does a certain amount of reading, writing, and updating of shared objects. And those reads, writes, and updates are of certain sizes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If your app likely changes only a few fields in a large object graph, then that is what your performance test should do. If your app is 90% read from multiple threads and 10% write from multiple threads than that is what your test should do. Make your test be true to what you need when it comes to data and usage.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anti-pattern 10: &lt;/span&gt;Log Yourself to Death&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Last, but far from least, doing extra stuff like writing data out to a log chews up CPU. Logging too much in any performance test can render the test results meaningless.&lt;br /&gt;This anti-pattern generally covers any extra CPU usage on a load-generating client that affects the performance test. In general, if one or more of your nodes is CPU bound in a cluster performance test, you likely have not maxed-out the performance of your cluster. Let me say that again, if you are resource constrained on any node, including your load generating nodes (but not including your server if one exists) then you are probably not maxing out what your cluster as a whole can handle. Investigate further.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If the individual load-generating nodes—or even the clustered nodes—are resource constrained, it is likely to create a false bottleneck in your test. You are trying to figure out the throughput of the cluster and your cluster nodes are likely busy doing other things like logging.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First, always have machine monitoring on all nodes in a performance test. Any time one of the nodes or load generators becomes resource constrained make sure you test with an additional node and see if it adds to the scale. If a node is unexpectedly resource constrained, then take a series of thread dumps (java only) and figure out where all the time is going.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alright, that is the end of my anti-pattern list for now. I could probably come up with a few more but I'll save them for another day. The moral of this section of the blog is to be curious and skeptical with your testing results. Don't just ask what the numbers are. Find out why and you will end up a much happier person.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-3843872443449101720?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/3843872443449101720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=3843872443449101720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3843872443449101720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/3843872443449101720'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/07/more-lies-distributed-performance.html' title='More Lies - Distributed Performance Testing Anti-patterns Part 3 of 4'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2196832645413902810</id><published>2007-07-02T12:51:00.000-07:00</published><updated>2007-07-02T19:21:15.698-07:00</updated><title type='text'>Distributed Performance Testing Anti-patterns Part 2 of 4</title><content type='html'>In &lt;a href="http://dsoguy.blogspot.com/2007/06/why-your-distributed-tests-are-lying-to.html"&gt;Part 1 &lt;/a&gt;of this 4 part blog I hit upon 3 Anti-Patterns that can make one's performance testing a poor representation of reality. Here I'm covering 3 more and will be following up with the last 4 in a few days. After that I'm going to talk about a simple distributed performance testing framework I'm going to give away to try and help people be more successful with this stuff.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anti-pattern 4:&lt;/span&gt; Fake Data Fake Performance&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using data in a distributed performance test that looks nothing like your real data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Distributed computing solutions use all kinds of strategies to move data between nodes under the covers. Just representing a size of data to be shared ignores those strategies and in many cases misrepresents the performance of a real system with real data under real load, both positively and negatively. You may be testing specially optimized flattening tricks that make the system look faster than it is; likewise, you may be testing a particular case that doesn’t perform well, but that isn’t representative of the true performance of the system with real data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Make sure you test with object graphs that vary in size, type, and depth in similar ways to the data you plan to use in your application. Don't assume Maps of Strings will behave anything like the way real object data will behave.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anti-pattern 5:&lt;/span&gt; Incoherent Cluster&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some clustering products are coherent, some are not, and some have both modes. Don't ignore whether you are testing the performance using the mode you really need for your application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While it is quite possible to have a coherent cluster that has the same throughput as an incoherent cluster, it is certainly harder to do.  Coherently clustered software frameworks require the provider to do some fancy locking, batching, windowing, and coherent lazy-loading tricks that aren't for the faint of heart (in the internals of the clustering engine, that is, not for the application developer). You can't assume that performance between a coherent and incoherent clustering approach will be the same.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Make sure that if what you need is coherently clustered data that you are actually testing that way. Also, if it’s coherence you’re after, it’s a good idea to verify the end-state of a performance test to make sure the system actually is coherent. Sort of post test verify phase.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anti-pattern 6:&lt;/span&gt; The World by a Thread&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Distributed tests that only use one thread per node.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For most clustered software, the name of the game is throughput with acceptable latency. Pretty much all distributed computing software does batching and windowing to improve throughput in a multi-threaded environment. Maxing out a single thread will usually not even approach the max throughput of the JVM or the system as a whole in the same way that a single node will not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Make sure your test uses multiple threads for generating load in each JVM. Check to see if you are cpu bound on any node. If you are not cpu bound you might have a concurrency  issue or just need to add more threads.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have 4 more anti-patterns that I'm going to publish next week. Keeping an eye on the full 10 will help greatly reduce mistakes in clustering and distributed computing. Once again I'll then be following up with a framework to help develop and run useful tests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2196832645413902810?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2196832645413902810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2196832645413902810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2196832645413902810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2196832645413902810'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/07/distributed-performance-testing-anti.html' title='Distributed Performance Testing Anti-patterns Part 2 of 4'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-7774006903787873237</id><published>2007-06-27T13:32:00.000-07:00</published><updated>2007-06-27T13:56:26.646-07:00</updated><title type='text'>Why Your Distributed Performance Tests Are Lying to You: Anti-Patterns of Distributed Application Testing and Tuning - Part 1</title><content type='html'>Clustering and distributing Java applications has never been easier than it is today (see &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt;). As a result, writing good distributed performance tests and tuning those applications is increasingly important. Performance tuning and testing of distributed and/or clustered applications is an important skill and many who do it can use a little help. Over my next few blogs I'm going to cover a series of anti-patterns in this area. I'll be following it up with a simple open distributed testing framework that I hope can help people out (hint, hint, the testing framework itself is distributed to best test distributed apps).&lt;br /&gt;&lt;br /&gt;Here are the first 3 anti-patterns...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Anti-pattern 1: Single-Node “Distributed” Testing&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Running your “distributed” performance test inside a single JVM.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depending on the framework, this can tell you either: 1) nothing, because the clustering framework recognizes it has no partners so optimizes itself out or 2) very little—it might give one an idea of maximum theoretical read/write speed for that framework.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When trying to evaluate the performance of any kind of clustering or distributed computing software, always use an absolute minimum of 2 nodes (Preferably more).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Anti-pattern 2: Single-Computer “Distributed” Testing&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Putting all (or just too many) of the resources for a performance test on one machine.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This has two problems. First, distributed applications running on the same machine have different latency and networking characteristics than distributed applications on different machines. This can hide various classes of problems around pipeline stalls, batching, and windowing issues.&lt;br /&gt;&lt;br /&gt;The second problem is a variation on another anti-pattern I will discuss later around resource contention. By running multiple JVMs on one machine you are now contending for CPU, disk, network, and potentially affecting context switch rate, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The only real way to test a distributed application is to run it in a truly distributed way: on multiple machines. If you must have multiple nodes/JVMs on one machine, make sure you are running one of the many resource-monitoring tools and make sure you aren't resource constrained (I use iostat/vmstat for simple tests).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Anti-pattern 3: Multi-Node, Load Only One&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Description&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Testing with multiple nodes but only sending load/work to one of those nodes while leaving the others just hanging out doing little or nothing&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depending on the distributed computing architecture chosen, the nodes that are not receiving load may be actually doing a lot of work. If that's the case, only loading one of the nodes is giving a false sense of performance. Also, in some cases, data is lazily loaded into nodes so only putting load on one node could be putting you in the same boat as the single-node tester where no actual clustering is happening.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When testing clustering software, make sure you are throwing load at all nodes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Be sure to check back soon as the next few anti-patterns will cover the data aspects of distributed performance testing...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-7774006903787873237?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/7774006903787873237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=7774006903787873237' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7774006903787873237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7774006903787873237'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/06/why-your-distributed-tests-are-lying-to.html' title='Why Your Distributed Performance Tests Are Lying to You: Anti-Patterns of Distributed Application Testing and Tuning - Part 1'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-7755764470789698724</id><published>2007-06-14T13:35:00.001-07:00</published><updated>2007-06-14T14:50:58.551-07:00</updated><title type='text'>Latency v Throughput</title><content type='html'>Which is the faster way to get your cargo across the United States. A plane or a train? Some might think the answer is obvious. A plane travels 500 mph (or so) and a train does maybe 80 mph. Therefore the plane is faster. Or is it? The question is really a matter of latency vs. throughput.&lt;br /&gt;&lt;br /&gt;Imagine you have to move a bunch of coal across the country and deliver it to a coal processor. Now say that on the west coast, the receiver of the coal can process 100 units of coal an hour. You have 1 train that can haul 10,000 units of coal and takes 48 hours to get to its destination. You have 1 plane that can deliver 100 units of coal in 12 hours.&lt;br /&gt;&lt;br /&gt;If the most important thing was to have the coal soon, then the plane is faster (lower latency). But, if the most important thing is to have the coal-processing pipeline filled on the west coast over time then train is faster (higher throughput). Every 96 hours they get 10k units of coal with the train (remember there’s only one train and, just like the plane, it must make the return trip to the east coast). That works out to about 100 units an hour which is just what you need. With the plane, every 96 hours you get 800 pounds of coal. Not nearly fast enough.&lt;br /&gt;&lt;br /&gt;The above discussion may seem obvious but I have this conversation all the time when talking about Software: what is fast and what is slow. I've had people tell me it's impossible to do 10 thousand transactions per second in &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; when persistent because the disk seek time is 10 millis. Well they would be right if you serialize things. But in infrastructure software, the game is throughput with acceptable latency and it turns out 10 thousand transactions per second isn't all that hard. With parallelism, batching, and windowing, the disk isn't even usually the bottleneck.&lt;br /&gt;&lt;br /&gt;Anyway, just wanted to get the throughput v latency thing off my chest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-7755764470789698724?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/7755764470789698724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=7755764470789698724' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7755764470789698724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7755764470789698724'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/06/latency-v-throughput.html' title='Latency v Throughput'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4055502705305581849</id><published>2007-06-12T19:00:00.000-07:00</published><updated>2007-06-17T11:33:07.291-07:00</updated><title type='text'>Now that's fast...</title><content type='html'>Alright, I promise I'll get back to blogging about Java and &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; stuff next time but... I've been reading a lot of negative press about Apple's &lt;a href="http://www.apple.com/safari/download/"&gt;Safari 3 beta&lt;/a&gt; and while some it is fair I haven't seen a lot of talk about the good stuff about it. So before people flame me let me start with:&lt;br /&gt;&lt;br /&gt;Yes, I know it has security holes and those need to be fixed&lt;br /&gt;Yes, I know it has some bugs (like it doesn't work with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Zimbra&lt;/span&gt;&lt;/span&gt; for me)&lt;br /&gt;&lt;br /&gt;But...&lt;br /&gt;&lt;br /&gt;It still has all the features from Safari 2:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;reset browser so when your surfing on someone &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;else's&lt;/span&gt; computer you can clean up everything you've logged into like e-mail. &lt;/li&gt;&lt;li&gt;Really good tabbed browsing &lt;/li&gt;&lt;li&gt;Private browsing (for when you want to pause the caching and recording of what your browsing)&lt;/li&gt;&lt;li&gt;plus &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;RSS&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;popup&lt;/span&gt; blocking and the other usual suspects.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Good new stuff in 3.0:&lt;br /&gt;&lt;br /&gt;This thing is blindingly fast? I haven't taken actual timings but just from eyeballing it this thing is super fast. It is much faster than what was already fast Safari 2.0. And much much faster than &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Firefox&lt;/span&gt;&lt;/span&gt;. I don't have the time to do real benchmarks on this but I would love to see some.&lt;br /&gt;&lt;br /&gt;Much improved inner search. How many times have I hit command F, typed some text, seen the window move but not be able to find where the highlighted word is. Safari does a really nice animated bubble highlight that is impossible to miss. Kudos to the Apple guys for simple subtle improvements.&lt;br /&gt;&lt;br /&gt;Plus I think it is supposed to be more standards compliant and it has this &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;resize&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;textbox&lt;/span&gt; feature which I haven't tried yet. &lt;span style="font-weight: bold;"&gt;update:&lt;/span&gt; Works great but worth noting that it only works for multi-line test fields not the single line variety.&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;update2: &lt;/span&gt;Someone pointed out that Safari3 also now has WYSIWYG editor support. Should have mentioned it since I used that when writing the blog :-)&lt;br /&gt;&lt;br /&gt;Anyway, don't want to sound like a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;fanboy&lt;/span&gt;&lt;/span&gt; boy, and I might be alone, but I actually like Safari 3.0 and think windows users should give it a go to.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4055502705305581849?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4055502705305581849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4055502705305581849' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4055502705305581849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4055502705305581849'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/06/now-thats-fast.html' title='Now that&apos;s fast...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-7959842306776334594</id><published>2007-06-07T19:43:00.000-07:00</published><updated>2007-06-18T12:56:12.761-07:00</updated><title type='text'>Why Ning is the thing...</title><content type='html'>&lt;a href="http://www.ning.com/"&gt;Ning&lt;/a&gt;, a website that allows one to create their own social networking website (a meta site for those geeks reading this). It is my pick for the sleeper coolest thing I've played with lately.  I peeked at this a year or so ago because I wanted to run a social network for my wife's sports league. Back then I thought it needed more bake time to be useful (putting it nicely). Well, while not perfect, it is quite nicely baked now. After playing with it for less than an hour my brain was teaming with cool ideas on how I can take advantage of this site.&lt;br /&gt;&lt;br /&gt;First thing I did was create a social network for my extended family. Everyone posts pictures and vids and it's so simple an adult could do it. Next I got my wife to create that &lt;a href="http://sports4good.ning.com/"&gt;social network&lt;/a&gt; for her &lt;a href="http://www.sports4good.org/"&gt;sports league&lt;/a&gt;. She used the business version so that she could use adsense with it and maybe make a few bucks :-). Next on my list is to create one for my kids pre-school. This thing is flat out addictive. It even has an api and gives pretty low level access to things like css. One can pay a little extra and have a custom domain name and remove all references to Ning.&lt;br /&gt;&lt;br /&gt;Support is good do. I sent a suggestion that I wanted a calendar for my family on ning and they got back to me in under 24 hours that one was on the way. Hey maybe someday they will cluster with &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt; ;-).&lt;br /&gt;&lt;br /&gt;Anyway, when I played with this way back when I was a little sceptical but now I'm sold. Kudo's for the team at &lt;a href="http://www.ning.com/"&gt;Ning&lt;/a&gt; for coming up with a cool idea and executing on it well.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;update: &lt;/span&gt;One person pointed out to me that they didn't feel this entry was particularly developer focused and that it is more of a review of a website (not their is anything wrong with that). I see that point but I believe I am not reviewing a website but am reviewing a development tool to a certain extent. Ning is a meta-website. Anyway, dig in and tell me if I'm crazy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-7959842306776334594?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/7959842306776334594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=7959842306776334594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7959842306776334594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/7959842306776334594'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/06/why-ning-is-thing.html' title='Why Ning is the thing...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-1595559637802691996</id><published>2007-05-19T11:32:00.000-07:00</published><updated>2007-05-19T11:39:33.703-07:00</updated><title type='text'>Performance Architecture</title><content type='html'>I was reading this &lt;a href="http://www.artima.com/lejava/articles/javaone_2007_steven_harris.html"&gt;article&lt;/a&gt; from another guy named Steve Harris (not me). I think he makes some interesting points but I thought I would follow up. Optimizing architecture to me mostly means designing for flexibility and testability. It also means having a way to test ones app for performance and scale. I've seen a number of people write apps, put them in prod without ever performance testing them.&lt;br /&gt;&lt;br /&gt;Write your app so that you can overlay the performance architecture after the fact. Have a way to EASILY validate your performance and you'll be ok. Optimizing code early (which he doesn't mention) is actually quite evil and almost always leads to &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;badness&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-1595559637802691996?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/1595559637802691996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=1595559637802691996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1595559637802691996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/1595559637802691996'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/05/performance-architecture.html' title='Performance Architecture'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-5588742595672127411</id><published>2007-05-19T01:30:00.000-07:00</published><updated>2007-05-19T02:45:32.921-07:00</updated><title type='text'>Teams, starts with the people</title><content type='html'>What are the needed traits across a company to have the greatest chance of success? How much of each trait does each individual have to have? These are questions that &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;everyone&lt;/span&gt; should ask themselves on both sides of the interview process and in ones everyday life.&lt;br /&gt;&lt;br /&gt;My list is as follows (not in any order):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Passion/Pride/Work ethic&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Knowledge/experience&lt;/li&gt;&lt;li&gt;Respect/Teamwork&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Judgement&lt;/li&gt;&lt;li&gt;Intelligence&lt;/li&gt;&lt;/ul&gt;The list itself can vary though probably not as widely as how much one values each item on that list.  The most important thing is to have the list and to use it as  a framework for how you choose jobs, hire, value and motivate existing people, and at times part ways.&lt;br /&gt;&lt;br /&gt;Since words tend to have very different meanings to different people despite the existence of dictionaries and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;wiki's&lt;/span&gt; I'm going to cover a bit what my list means to me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Passion/Pride/Work Ethic&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;First let me start with what this doesn't mean. Passion and pride does not have anything to do with outward energy. One does not have to be "Rah Rah" to have passion and pride. Many of the people who I feel have had the most passion have actually been super quiet. Passion is about commitment to the task at hand and the greater goal. It's about going the extra mile to get things done well, on time, and sometimes in ways that nobody else thought of. It's about finding the things that need to get done that nobody noticed and being the person to do them while not dropping the things they are supposed to be doing :-).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Knowledge&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Knowledge is what you "know" coming into a problem. Intelligence is what you can learn/how well one solves problems. In many cases knowledge is the least important of the five. For given positions one should always give some thought to how much specific knowledge is actually needed. I constantly see job postings with a long list of knowledge items and almost no indication of the other 4 items importance. IMHO If you can find people who excel in the other four areas, knowledge of a given specific task can be lower (though not zero. Working with people who have zero knowledge of their domain can be very expensive. It's less of an issue for large companies with time and money).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Respect/teamwork&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I focus on respect more than one might imagine. I worked with a guy who said he spends 75 percent of his time in an interview trying to figure out if the person will work well in the team. I think that's a good idea. It's not about whether the person is social or fun. It's about whether they present their ideas with an understanding that those around may have better ones. Do they listen to feedback, even from people they do not expect to have good ideas. Do they listen in general or do they just wait for their turn to talk. This is important stuff. Don't underestimate it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Judgement&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is another really important one. Their is a nice coverage of how important this is in the book "&lt;a href="http://www.amazon.com/Producing-Open-Source-Software-Successful/dp/0596007590"&gt;Producing Open Source Software&lt;/a&gt;.(A free version of this book exists)" Whether someone is your boss, your co-worker or your employee, you need to be able to trust their judgement more than anything else. If the people around you are smart but have bad judgement they will create excellent solutions to the wrong problems. If people are not smart and have bad judgement they will create poor solutions to the wrong problems. On the other side of the coin, if they are smart and have good judgement they will create great solutions to the right problems. &lt;span style="font-weight: bold;"&gt;Most importantly&lt;/span&gt;, if they are not smart (&lt;span style="font-style: italic;"&gt;and on any given day all of us are not smart&lt;/span&gt;) but have excellent judgement they will still make good decisions about what to do, and most usefully, what not to do. While I find it really really hard to interview for, Judgement is huge!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intelligence&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Having some Intelligence is important. More important for some jobs than for others. When hiring, know how much intelligence (balanced against the others) is needed for the position/type of work. For some jobs, judgement and hard work with some intelligence is what is needed. Have questions in mind that will indicate whether a person is smart enough. Since intelligence is the easiest of the bunch to test for Don't Forget to Do it! To many people mistake liking someone, "talking the talk" or even looks for intelligence. Do the work, have your intelligence questions in mind when you interview someone.&lt;br /&gt;&lt;br /&gt;The above are some high order bits. When I again get some time and motivation I want to cover team building from a balance perspective. Recognizing and filling ones personal and team gaps.&lt;br /&gt;&lt;br /&gt;Ok, it's 2:30 am and I'm starting to question my judgement for being up so late. What's my point here? Think about what you want in employees coworkers and bosses. Sometimes even assign numbers to the core values you look for so you can compare people.&lt;br /&gt;&lt;br /&gt;I read that we make up our mind about people we meet in seconds. Before they even speak in most cases and that those first impressions are VERY hard to overcome. So have the tools ready to make wise informed decisions and fight past human nature.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-5588742595672127411?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/5588742595672127411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=5588742595672127411' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/5588742595672127411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/5588742595672127411'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/05/teams-starts-with-people.html' title='Teams, starts with the people'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-2713892261506808875</id><published>2007-04-05T10:13:00.000-07:00</published><updated>2007-04-06T02:56:04.342-07:00</updated><title type='text'>The int size problem...</title><content type='html'>I'm just curious. Of the people out there using 64bit jvms, has anyone run into the int collection size problem? One of the things I've been quitely worried about for awhile now is that with both 64 bit jvm's and the virtual heap stuff provided by &lt;a href="http://www.terracotta.org"&gt;Terracotta&lt;/a&gt; DSO it is  possible for an ArrayList or a HashMap to grow beyond what an integer can hold. Sure 2 gig of objects is a ton to be in a collection but if one has a 128g heap it isn't crazy anymore.&lt;br /&gt;It's easy to make the collections able to handle the larger sizes but so much code is written to the current collection interfaces it might be a problem. Have the smart people at Sun started tackling this already? Maybe some JSR?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-2713892261506808875?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/2713892261506808875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=2713892261506808875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2713892261506808875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/2713892261506808875'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/04/int-size-problem.html' title='The int size problem...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-4550433593340482389</id><published>2007-02-08T19:55:00.000-08:00</published><updated>2007-02-08T20:22:38.015-08:00</updated><title type='text'>Motorboard 2000x First days...</title><content type='html'>&lt;span style="font-size:130%;"&gt;Overview:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While most of my posts tend to be about software I recently got a new electric scooter for commuting to &lt;a href="http://www.terracotta.org/"&gt;work&lt;/a&gt; (shameless plug for the coolest new software product in years!) so I thought I would blog about it. After doing a bunch of research it came down to a choice between the&lt;a href="http://www.goped.com/"&gt; goped 750 sport&lt;/a&gt;   and what I ended up choosing the &lt;a href="http://http//www.gosportinggoods.com/"&gt;motorboard 2000x.&lt;/a&gt; The goped seemed a bit more powerful/rugged and the motorboard looked much much better and was less than half the weight. Since I plan to use this thing to commute around a mile each way to work on flat ground and I wanted to be able to easily dump it in the trunk of my car I went the cooler looking lighter route (also is cheaper 399 v around 599 but that wasn't a strong factor as neither were as expensive as all the parking tickets I was getting).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;First Impressions:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've had this device for two days so I will update this as I learn more.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It looks even cooler in person than it does on the website. At first glance you wouldn't even think it is electric powered. So I'm happy about that. &lt;/li&gt;&lt;li&gt;No setup at all really. Took it out of the box and had it together with no tools in about 1 minute.&lt;/li&gt;&lt;li&gt;The battery stuff is a bit of a pain in the butt. It actually matters whether you plug the charger into the wall first or into the device first. I messed this up because, unlike the rest of the world, I didn't carefully read what was written on the charger.&lt;/li&gt;&lt;li&gt;I can't ride it to and from work yet because the ground is wet from rain. That is a bit annoying but I knew about this limitation before I bought it so I can't complain.&lt;/li&gt;&lt;li&gt;I got it all charged and tooled around our office with it. It's fast and smooth. Really fun to ride.&lt;/li&gt;&lt;li&gt;When people in the 200 pound range from my office tried it they would often get the dreaded blinking red light. I think this could be a combo of them being close to the weight limit and riding on low carpet putting strain on the device.&lt;/li&gt;&lt;li&gt;Did I mention all the rules around charging this thing are annoying?&lt;/li&gt;&lt;li&gt;I live in a building so I took it into the garage and rode around for about 1/2 an hour. It was fun and the thing was smooth and worked great. It is nice and fast. It didn't make it up the hill between the first level and second level of our garage but that hill is a bit steep so I can't fault it to much.&lt;/li&gt;&lt;li&gt;Another thing to note is that both before and after my purchase I sent support questions via e-mail and they always got back to me within 24 hours. In our world of automated phone systems and outsourced support I was pretty pleased with this.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;Conclusions:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;So far I am happy with my purchase. I haven't seen anything else I would have rather had. If these guys can get the electronics to be a bit less sensitive this thing would be the greatest thing since sliced bread. I'll update when the rain in SF stops...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-4550433593340482389?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/4550433593340482389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=4550433593340482389' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4550433593340482389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/4550433593340482389'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/02/motorboard-2000x-first-days.html' title='Motorboard 2000x First days...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-9172491408844867506</id><published>2007-01-27T17:15:00.000-08:00</published><updated>2011-04-25T08:59:28.178-07:00</updated><title type='text'>Programming by Wishful Thinking</title><content type='html'>I'm currently reading an excellent book called &lt;a href="http://www.pragmaticprogrammer.com/titles/bmsft/index.html"&gt;Everyday Scripting&lt;/a&gt;. I'm really enjoying it as a nice primer on whipping things up with Ruby. When I hit chapter 7 the author began to discuss a programming style that I have used for a while now.  I had no idea this simple technique had a name. Many of the things I've picked up throughout my career I've learned from books, articles, reading code, and still others I've devised from first principals. This particular practice I picked up while pair programming with this super smart guy &lt;a href="http://www.gigamonkeys.com/book/"&gt;Peter Seibel&lt;/a&gt;. Apparently it's called "Programming by Wishful thinking."&lt;br /&gt;&lt;br /&gt;The idea is that when you have some code to write you first do so as if methods existed already to perform the high level operations. Say you want to write some code that tells you how many songs and albums you have by a given artist. Programming languages don't have methods do to this baked in but you pretend they do. An extreme example of the practice would be:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/940702.js?file=gistfile1.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I came up with this example in about thirty seconds so I hope it isn't to opaque.&lt;br /&gt;&lt;br /&gt;You may then go on to write the above methods in the same way:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/940704.js?file=gistfile1.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;and so on and so on. Anyway, don't know how many people out there use this style but I've found it really helpful when I need to keep focused on the task/flow at hand without getting to distracted by the details of an issue. Maybe it will help someone else too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-9172491408844867506?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/9172491408844867506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=9172491408844867506' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/9172491408844867506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/9172491408844867506'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2007/01/programming-by-wishful-thinking.html' title='Programming by Wishful Thinking'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-6717312274040631104</id><published>2006-12-19T14:30:00.000-08:00</published><updated>2006-12-19T14:31:36.459-08:00</updated><title type='text'>Wisdom and Terracotta... Good mix</title><content type='html'>This guy wrote about two topics that I like. The book wisdom of crowds and Terracotta DSO:&lt;br /&gt;&lt;br /&gt;http://blogs.techrepublic.com.com/opensource/?p=31&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-6717312274040631104?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/6717312274040631104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=6717312274040631104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6717312274040631104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/6717312274040631104'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2006/12/wisdom-and-terracotta-good-mix.html' title='Wisdom and Terracotta... Good mix'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-115929545726818613</id><published>2006-09-26T11:16:00.000-07:00</published><updated>2006-09-26T11:30:57.323-07:00</updated><title type='text'>Pairing can make you stupid...</title><content type='html'>Pretty much everyone has heard of or tried pair programming. I personally have found it to be quite valuable. One very interesting thing I was reminded of when watching some people on my team do some pairing is how dumb pair programming makes the typer. Conversely, it also makes the watcher (don't know what it's really called) considerably smarter.&lt;br /&gt;&lt;br /&gt;I can vividly remember pairing with someone much smarter than me on a transaction logging system a few years back and noticing this effect. When he was typing, I was always coming up with the cool ideas. Of course it's not always an intelligence thing. Around the office I have noticed multiple pairs demonstrate this. The typer becomes dump. The non-typers make excellent judgments and decisions.&lt;br /&gt;&lt;br /&gt;I think the obvious explanation for this is just how much energy we put into things like typing, picking variable names, formatting, etc... I've often joked that we should hire secretaries with a little programming knowledge for each programmer.&lt;br /&gt;&lt;br /&gt;Has anyone else out there noticed this? Is their anything to be gained from this observation? Or am I completely off base.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-115929545726818613?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/115929545726818613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=115929545726818613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/115929545726818613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/115929545726818613'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2006/09/pairing-can-make-you-stupid.html' title='Pairing can make you stupid...'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-115924660985471195</id><published>2006-09-26T03:12:00.000-07:00</published><updated>2007-07-20T08:19:22.938-07:00</updated><title type='text'>Performance Tuning with Thread Dumps</title><content type='html'>As a follow on to my earlier &lt;a href="http://dsoguy.blogspot.com/2006/09/performance-tuning-tips-for-java-no.html"&gt;tuning blog&lt;/a&gt; I whipped up a quick sample to make the Performance tuning with Thread dumps point clearer (see my previous blog). Take a look at the following code and make a guess at what you think the slowest part of the code is and why. &lt;pre&gt;&lt;br /&gt;&lt;br /&gt;package softwareandstuff.performance;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;public class SomethingToRun {&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;   List&lt;string&gt; stuff = new ArrayList&lt;string&gt;();&lt;br /&gt;   Random r = new Random();&lt;br /&gt;   long total = 0;&lt;br /&gt;   long count = 0;&lt;br /&gt;   while (true) {&lt;br /&gt;     long start = System.currentTimeMillis();&lt;br /&gt;     String s = " " + r.nextInt() + " " + r.nextInt();&lt;br /&gt;&lt;br /&gt;     for (int i = 0; i &lt; i =" 0;" 1000 ="=""&gt;&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;On my slow computer it took around 43 seconds per 1000.&lt;br /&gt;&lt;br /&gt;Now use jps to find out what process id the little app has and do a "kill -3 &lt;process id=""&gt;" 10 to 20 times fast in succession.&lt;br /&gt;&lt;br /&gt;Note: jps requires jdk1.5 to be installed. Figure out how to use task manager in windows or ps on unix based platforms if you are not on jdk1.5&lt;br /&gt;&lt;br /&gt;&lt;/process&gt;&lt;pre&gt;&lt;br /&gt;steve:~ steve$  jps&lt;br /&gt;&lt;br /&gt;7595 Jps&lt;br /&gt;7594 SomethingToRun&lt;br /&gt;7440 startup.jar&lt;br /&gt;&lt;br /&gt;steve:~ steve$ kill -3 7594&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: See the following link for more on how to do thread dumps and what they are &lt;a href="http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/"&gt;A little on thread dumps&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Should see something like the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;Signal Dispatcher" daemon prio=9 tid=0x005098d0 nid=0x1820a00 waiting on condition [0x00000000..0x00000000]&lt;br /&gt;&lt;br /&gt;"Finalizer" daemon prio=8 tid=0x00509030 nid=0x180fc00 in Object.wait() [0xf0a04000..0xf0a04ab0]&lt;br /&gt;at java.lang.Object.wait(Native Method)&lt;br /&gt;- waiting on &lt;0x266101e0&gt; (a java.lang.ref.ReferenceQueue$Lock)&lt;br /&gt;at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)&lt;br /&gt;- locked &lt;0x266101e0&gt; (a java.lang.ref.ReferenceQueue$Lock)&lt;br /&gt;at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)&lt;br /&gt;at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)&lt;br /&gt;&lt;br /&gt;"Reference Handler" daemon prio=10 tid=0x00508c40 nid=0x180ec00 in Object.wait() [0xf0983000..0xf0983ab0]&lt;br /&gt;at java.lang.Object.wait(Native Method)&lt;br /&gt;- waiting on &lt;0x26610260&gt; (a java.lang.ref.Reference$Lock)&lt;br /&gt;at java.lang.Object.wait(Object.java:474)&lt;br /&gt;at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)&lt;br /&gt;- locked &lt;0x26610260&gt; (a java.lang.ref.Reference$Lock)&lt;br /&gt;&lt;br /&gt;"main" prio=5 tid=0x005013b0 nid=0x1804600 runnable [0xf07ff000..0xf08002c0]&lt;br /&gt;at softwareandstuff.performance.SomethingToRun.run(SomethingToRun.java:25)&lt;br /&gt;at softwareandstuff.performance.SomethingToRun.main(SomethingToRun.java:36)&lt;br /&gt;&lt;br /&gt;"VM Thread" prio=9 tid=0x00508460 nid=0x1803c00 runnable&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: ignore any thread that is in Object.wait() for now. In fact, searching on runnable is usually your best bet for skipping to the things that are interesting from a performance perspective.&lt;br /&gt;&lt;br /&gt;My guess is what you will see is that a decent percentage of the time is spent in the remove call. hmmm, wonder why that is. Now go look at the implementation of remove on an ArrayList and it will all be clear. Now try using a linked list instead. For me that dropped it down to 6 seconds per 1000.&lt;br /&gt;&lt;br /&gt;busy today but more to come...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-115924660985471195?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/115924660985471195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=115924660985471195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/115924660985471195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/115924660985471195'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2006/09/performance-tuning-with-thread-dumps.html' title='Performance Tuning with Thread Dumps'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34926058.post-115906120873502590</id><published>2006-09-23T18:15:00.000-07:00</published><updated>2006-09-27T18:41:46.316-07:00</updated><title type='text'>Performance Tuning Tips for Java - No tools required</title><content type='html'>Over the years I've developed a simple methodology for doing performance tuning. To tell the truth, I didn't even know it was a methodology until I realized that whenever people said "The software is slow!" I always responded with the same actions. In this article I'm going to talk about what I now fondly call, "Performance tuning by Steve" (Can you tell I've seen one to many infomercials in my day?)&lt;br /&gt;&lt;br /&gt;First things first:&lt;br /&gt;&lt;br /&gt;Someone comes to you as a developer and says, "The software is too slow." They usually have between 2 and 5 guesses as to why it's slow and maybe so do you. What do you do? I'll tell you what you NEVER do. You NEVER take action based on a guess of what the problem is. The only thing worse than an outsiders guesses as to why your software is slow are your own guesses. Do the investigation. I can't tell you how many times I hear people insist that the reason some piece of software is slow is because of networking, disk or database even though the machine is cpu bound. Before I touch a line of code I always ask these two basic questions.&lt;br /&gt;&lt;br /&gt;1) Are you CPU bound&lt;br /&gt;&lt;br /&gt; (if it is a multi process test I ask if they are cpu bound on any of the boxes involved in the test). If it is a multi cpu machine I ask if any one processor is pegged.&lt;br /&gt;&lt;br /&gt;   Answer I usually get is "I don't know." Ahh, I say. Can you run your test again with vmstat (translates to iostat on the mac and that Perfomance thing in the task bar on Windows). Don't forget to tee the output to a file.&lt;br /&gt;&lt;br /&gt;2) Are you GC bound?&lt;br /&gt;&lt;br /&gt;    Answer I usually get, "I don't know." I usually follow with. " Can you run your test again with all processes having some variant on the -verbose:gc flag turned on. And don't forget to tee it to a file. If they are GC bound then one needs to do GC/Garbage creation tuning which I will save for another day. It is a big topic on its own.&lt;br /&gt;&lt;br /&gt;If they come back and say, "Yes I'm cpu bound! and no I'm not spending tons of time in GC." My mouth waters a bit. I scratch my chin gently and say, "Great! can you take a series of thread dumps while your app is running." At this point I get a funny look. Why? "I don't think it's deadlocked" They usually say. Well this is an extremely effective way to see where an application is spending it's time. In my experience this is more effective than even a good profiler. If you run a load test that is cpu bound and take a series of thread dumps you will find out where your code is spending time. For a little more on thread dumps check this out. &lt;a href="http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/"&gt;A little on thread dumps&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I usually perform analysis on the thread dumps, fix the thing that is the worst offender than try the test again. Rinse dry repeat...&lt;br /&gt;&lt;br /&gt;Now you are not CPU bound anymore. What next? I'll tell you what still isn't next. DON'T GUESS! you will be wrong. I promise!&lt;br /&gt;The trick here is to find the bottleneck. It is best to think about a non cpu bound performance problem as thread starvation. Not a network problem and not a disk problem (at least at first and for this their are exceptions).&lt;br /&gt;&lt;br /&gt;If you are using SEDA style development (think work queues) then your lucky. The next thing you have to do is just find out what queue is backing up. Really, any statemachine style programming can use this technique. &lt;br /&gt;- Which ever queue is backing up is where your performance problem is. &lt;br /&gt;- You may need to add more worker threads to the end of the Queue. Especially if the threads are doing blocking tasks of any kind.&lt;br /&gt;- You may need to do a better job of separating out CPU tasks from blocking tasks.&lt;br /&gt; * If you have a lot of disk writing to do than the thread that writes to disk should do almost 0 cpu work otherwise you will get pipeline stalls going to disk. Big mistake.&lt;br /&gt;- You may need to more effectively synchronize something if your threads are all blocked waiting for the same resource.&lt;br /&gt;&lt;br /&gt;If you are not doing SEDA style development or if you are but you have found the queue that is backing up but don't know why yet then here is the next fun step.&lt;br /&gt;Warning, it is time consuming but very effective.&lt;br /&gt;Wrap large swaths of your slow code like so:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;pre&gt;&lt;br /&gt;long start = System.currentTimeMillis();&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;-your code-&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;long t = System.currentTimeMillis() - start;&lt;br /&gt;&lt;br /&gt;count++;&lt;br /&gt;total += t;&lt;br /&gt;if(count % 1000 == 0){   //&lt;-- obviously the number you divide by here is dependent on how often the code is called&lt;br /&gt; System.out.println("T1 Average: " + (t/count)+" count:"+count); &lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;Do this in multiple parts of your code and then basically keep moving the timing in tighter and tighter until you have found the part or parts of your code that are taking the longest. This takes some practice. You'll probably get fooled by thread starvation a few times. Maybe get fooled by some blocking calls, ie. network or disk. Keep your mind clear. Try and draw on a white board the hand offs between threads.&lt;br /&gt;&lt;br /&gt;One last thing. TAKE NOTES, lots of NOTES. Save the output from every run and make a little readme that reminds you what each experiment was and even any thoughts you had during said experiment.&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;1) Figure out if you are CPU bound&lt;br /&gt;2) Eliminate GC as a concern (tuning GC is a whole other article)&lt;br /&gt;3) If you are cpu bound use thread dumps to figure out where time is being spent (ignore things in wait, only runnables)&lt;br /&gt;4) If you are not then do the following: &lt;br /&gt; - Still take thread dumps to understand where threads are blocked and where they are runnable&lt;br /&gt; - Bottleneck analysis, find out where things are backing up moving through your state machine&lt;br /&gt; - use timings over many calls of each code path and then move those timings in on the areas that are slow until you figure out where the problem is.&lt;br /&gt;5) Take lots of detailed notes and save all artifacts of each run.&lt;br /&gt;&lt;br /&gt;Good luck&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34926058-115906120873502590?l=dsoguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dsoguy.blogspot.com/feeds/115906120873502590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34926058&amp;postID=115906120873502590' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/115906120873502590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34926058/posts/default/115906120873502590'/><link rel='alternate' type='text/html' href='http://dsoguy.blogspot.com/2006/09/performance-tuning-tips-for-java-no.html' title='Performance Tuning Tips for Java - No tools required'/><author><name>Steve Harris</name><uri>http://www.blogger.com/profile/17342689039838434111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>
