Spring’s ThreadLocalTargetSource

By Rob, May 9, 2009 10:50 am

ThreadLocalTargetSource, as the name already explains, is a proxied ThreadLocal helper class. Spring provides this class together with other pooling mechanisms as a better version of the Sun’s ThreadLocal class. One of the benefits is the already created wrapper class around the threadlocal and much more important, it destroys automatically the old thread references when the BeanFactory is destructed.

But actually these kind of features always sound to good to be true to me. I really wanted to figure out how safe it is and how far you can go. A simple testapplication showed me that it’s absolutely powerful!

So far I didn’t have much experience with ThreadLocal’s, they sound a bit evil to but on the other hand very useful. And I was afraid for the memory usage, keeping objects in memory per thread must have its cost. But Spring insures me that the objects will be automatically removed as soon as possible, although that still means that objects can live quite some time. Especially the automatically destroy functionality was for me a good reason to use the ThreadLocalTargetSource and not a custom wrapper for a ThreadLocal. If you really would like to use the ThreadLocal, be sure that you don’t forget to unset the object for every requestcycle. Otherwise it’s a just a matter of time before your application will start throwing Java heap space errors :) .

Now it’s time for my example, to start with the bean config:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="testBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource" ref="testThreadLocalTargetSource" />
</bean>
<bean id="testBeanUtil" class="nl.tigrou.threadlocal.TestBeanUtil">
<property name="testBean" ref="testBean" />
</bean>
<bean id="testThreadLocalTargetSource" class="org.springframework.aop.target.ThreadLocalTargetSource"
destroy-method="destroy">
<property name="targetBeanName" value="testTarget" />
</bean>
<bean id="testTarget" class="nl.tigrou.threadlocal.TestBeanImpl" scope="prototype">
<property name="myValue" value="boe!" />
</bean>
</beans>

A simple Pojo:


public class TestBeanImpl implements TestBean {

private String myValue;

public void setMyValue(String myValue) {
this.myValue = myValue;
}

public String getMyValue() {
return myValue;
}

}

A util class to test the proxy’ing even better:


public class TestBeanUtil {

private static TestBean testBean;

public void setTestBean(TestBean testBean) {
TestBeanUtil.testBean = testBean;
}

public static TestBean getTestBean() {
return testBean;
}
}

And a simple testclient with 2 testcases:


public class ThreadLocalTest {

private ClassPathXmlApplicationContext context;

public static void main(String[] args) {
new ThreadLocalTest();
}

public ThreadLocalTest() {

context = new ClassPathXmlApplicationContext("applicationContext.xml");

for(int i=0; i < 10; i++)
{
ThreadTest test = new ThreadTest(i);
test.setName("Thread1-"+i);
test.start();
}

for(int i=0; i < 10; i++)
{
Thread2Test test2 = new Thread2Test(i);
test2.setName("Thread2-"+i);
test2.start();
}
}

private class ThreadTest extends Thread
{
private final int number;

public ThreadTest(int number) {
this.number = number;

}

public void run() {
TestBean testBean = (TestBean) context.getBean("testBean");

testBean.setMyValue(String.valueOf(number));
System.out.println(Thread.currentThread().getName() + ", bean value: " + testBean.getMyValue());

}
}

private class Thread2Test extends Thread
{
private final int number;

public Thread2Test(int number) {
this.number = number;

}

public void run() {

TestBeanUtil.getTestBean().setMyValue(String.valueOf(number));
System.out.println(Thread.currentThread().getName() + ", bean value: " + TestBeanUtil.getTestBean().getMyValue());

}
}

}

The above testclient starts 10 x 2 threads where both different threadclasses read and set the value in the threadlocal. The result in the console is:

Thread1-0, bean value: 0
Thread1-2, bean value: 2
Thread1-3, bean value: 3
Thread2-4, bean value: 4
Thread1-4, bean value: 4
Thread2-5, bean value: 5
Thread1-9, bean value: 9
Thread2-6, bean value: 6
Thread2-2, bean value: 2
Thread1-7, bean value: 7
Thread2-0, bean value: 0
Thread2-1, bean value: 1
Thread2-8, bean value: 8
Thread1-5, bean value: 5
Thread1-8, bean value: 8
Thread1-6, bean value: 6
Thread2-3, bean value: 3
Thread2-7, bean value: 7
Thread2-9, bean value: 9
Thread1-1, bean value: 1

Totally random order of execution as you can expect with threads but never a duplicate combination of threadnumber and value! Very simple but very powerful. You can access the beanvalues from everywhere withing the same thread, even with a static reference in a util class.

Next subject, my AOP headache issue with a combination of Advices and Aspects.

Share and Enjoy:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • DZone
  • RSS
  • Twitter

Nested transactions and their db connections

By Rob, April 28, 2009 10:21 pm

Last week I was researching the AOP config from an big application because I wasn’t really happy with the way it was implemented right now. The idea was to improve the performance by reducing the number of calls initiated by the AOP proxy. But there was a thing I wasn’t really sure about. How does Spring handle transactions when there are nested service class calls from one service to the other?

When I don’t how something exactly works, I create a small sample application. Nothing shocking, just a sample app which gives me the possibility to look to the different transaction propagations. And who knows if it could help other people as well, so I added the idea to my blog.

Let’s start with the Spring application context:


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.5.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<aop:aspectj-autoproxy/>

<tx:advice id="txAdvice" transaction-manager="txManager">

<tx:attributes>
<!-- normally you would exclude read actions from required transactions but I only wrote a get method for testing purpose -->
<!-- tx:method name="get*" propagation="SUPPORTS" read-only="true" /-->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="serviceOperation" expression="bean(*Service)"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost/world" />
<property name="user" value="" />
<property name="password" value="" />
</bean>

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/sqlmapconfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="countryService" class="nl.tigrou.test.service.CountryServiceImpl">
<property name="countryDao" ref="countryDao" />
<property name="cityService" ref="cityService" />
</bean>

<bean id="countryDao" class="nl.tigrou.test.persistence.CountryDaoImpl">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>

<bean id="cityService" class="nl.tigrou.test.service.CityServiceImpl">
<property name="cityDao" ref="cityDao" />
</bean>

<bean id="cityDao" class="nl.tigrou.test.persistence.CityDaoImpl">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>

</beans>

The only interesting thing in here is the tx:advice element defining the right propagation settings.

Now the pieces of Java code:


// grab countries
List<Country> countries = countryService.getCountries();

// this is the getCountries method
// which is btw a good example of how you shouldn't do this with iBatis
// always try to avoid N+1 selects!
List<Country> countries = countryDao.getCountries();
for(Country country: countries){
List<City> cities = cityService.getCities(country.getCode());
country.setCities(cities);
}

That’s all! Now enable the debug logging on for example the org.springframework.jdbc.datasource package and you’ll see something like this:

2009-04-28 22:07:47,591 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [nl.tigrou.test.service.CountryService.getCountries]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2009-04-28 22:07:48,684 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@46d0cc] for JDBC transaction
2009-04-28 22:07:48,821 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Participating in existing transaction
2009-04-28 22:07:48,829 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Participating in existing transaction
2009-04-28 22:07:48,832 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Participating in existing transaction
2009-04-28 22:07:48,834 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Participating in existing transaction
2009-04-28 22:07:48,837 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Participating in existing transaction
2009-04-28 22:07:48,839 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Participating in existing transaction
2009-04-28 22:07:48,840 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Participating in existing transaction
2009-04-28 22:07:48,842 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Participating in existing transaction
2009-04-28 22:07:49,376 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction commit
2009-04-28 22:07:49,376 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Committing JDBC transaction on Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@46d0cc]
2009-04-28 22:07:49,376 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@46d0cc] after transaction
2009-04-28 22:07:49,378 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource

As you see, Spring initializes a transaction and when another transaction is about to start, Spring runs these other db calls inside the existing transaction. Of course you can heavily influence this by changing the transaction propagation.

Conclusion: Spring did the job exactly as expected and I’m pretty happy with the solution as well.

btw, next subject is probably the use of Spring’s ThreadLocalTargetSource.

Share and Enjoy:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • DZone
  • RSS
  • Twitter

Keep an eye on your iBatis cachemodels

By Rob, April 7, 2009 10:38 pm

As you might have read already, I’m using iBatis for more then a year now and so far I really like it. Ok, it has some drawbacks and not comparable to something like Hibernate. IBatis is just an OR Mapper. The current 2.3.x release is a bit outdated in my opinion but they’re working hard on the new and shiny 3.0 version (read here about the plans) but that’s still far away, a total rewrite takes time.

One of the things clear things in iBatis is the caching mechanism, it’s plain and simple and easy customizable. By default, it’s using a LRU algorithm but you can change that easily to something different, or maybe even cooler, you’re own algorithm. But that’s for another post in the future. Last weekend I was thinking about how to monitor the succes of your iBatis query caches. You could do that (probably, never tried) with JMX but I was looking for a simple and clean solution. I already did the same in a Wicket application but I didn’t want too many extra dependencies. So I wrote a simple Servlet which accesses the Spring context and prints the cachemodels with their hitratio. Actually pretty simple, it took a lot more time to create a db schema with data and writing some code which uses a cache :) .

Simple screenshot:

picture-2

The actual code

My apologees for the horrible code layout, I’m searching for another code preview thingy for WordPress….

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>ibatiscachemodel</display-name>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <servlet>
    <servlet-name>myhttprequesthandler</servlet-name>
    <servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>myhttprequesthandler</servlet-name>
    <url-pattern>/CacheServlet</url-pattern>
  </servlet-mapping>
</web-app>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost/world" />
		<property name="username" value="rob" />
		<property name="password" value="rob" />
	</bean>

	<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
		<property name="configLocation" value="WEB-INF/sqlmapconfig.xml" />
		<property name="dataSource" ref="dataSource" />
	</bean>

	<bean id="myhttprequesthandler" class="nl.tigrou.test.MyHttpRequestHandler">
		<property name="countryService" ref="countryService" />
		<property name="helper" ref="helperDao" />
	</bean>

	<bean id="countryService" class="nl.tigrou.test.service.CountryServiceImpl">
		<property name="countryDao" ref="countryDao" />
	</bean>

	<bean id="countryDao" class="nl.tigrou.test.persistence.CountryDaoImpl">
		<property name="sqlMapClient" ref="sqlMapClient" />
	</bean>

	<bean id="helperDao" class="nl.tigrou.test.persistence.HelperDaoImpl">
		<property name="sqlMapClient" ref="sqlMapClient" />
	</bean>
</beans>

HelperClassDaoImpl (exposing the cachemodels from the SqlMapClient)

package nl.tigrou.test.persistence;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.ibatis.sqlmap.engine.impl.ExtendedSqlMapClient;
import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;

public class HelperDaoImpl extends SqlMapClientDaoSupport implements HelperDao {

	public List getCacheModels() {
		final ExtendedSqlMapClient ext = (ExtendedSqlMapClient) getSqlMapClient();

		SqlMapExecutorDelegate dlgt = ext.getDelegate();
		Iterator iter = dlgt.getCacheModelNames();
		List models = new ArrayList();

		while (iter.hasNext())
			models.add(iter.next());
		return models;
	}

	 public SqlMapExecutorDelegate getSqlMapExecutorDelegate()
	  {
	    final ExtendedSqlMapClient ext = (ExtendedSqlMapClient) getSqlMapClient();
	    return ext.getDelegate();
	  }

}

MyHttpRequestHandler (inheriting from Spring’s HttpRequestHandler to access the Spring context)

package nl.tigrou.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import nl.tigrou.test.persistence.HelperDao;
import nl.tigrou.test.service.CountryService;

import org.springframework.web.HttpRequestHandler;

public class MyHttpRequestHandler implements HttpRequestHandler {

	private CountryService countryService;
	private HelperDao helper;

	public void handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter pw = new PrintWriter (response.getOutputStream());

		pw.println("<html>");
	    pw.println("<head><title>Cachemodels</title>");
	    pw.println("<body>");
	    pw.println("<h1>Cachemodels</h1>");

	    countryService.getCountries();

	    pw.println("<table>");

	    Double ratio;
	    for (String name: helper.getCacheModels()) {
	    	ratio = helper.getSqlMapExecutorDelegate().getCacheModel(name).getHitRatio();
			pw.println("<tr><td>" + name + "</td><td>" + ((ratio.isNaN())? 0 : ratio) + "</td></tr>");
		}
	    pw.println("</table>");

	    pw.println("</body></html>");
	    pw.flush();
	}

	public void setCountryService(CountryService countryService) {
		this.countryService = countryService;
	}

	public CountryService getCountryService() {
		return countryService;
	}

	public void setHelper(HelperDao helper) {
		this.helper = helper;
	}

	public HelperDao getHelper() {
		return helper;
	}
}

Of course there are several other files (classes and iBatis files) but those are not really interesting. I’ve zipped my eclipse project and uploaded it here. Download

Share and Enjoy:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • DZone
  • RSS
  • Twitter

Ben Sims – Escapism Pt. 2

By Rob, February 20, 2009 11:11 pm

ben_frontAs written in my first post, I was looking forward to this new mix cd from Ben Sims. My collection counts now 3 cd’s from the Britisch techno guy. Escapism 1 and 2 and a theory of interpretation. They have things in common, like lots of tracks on 1 cd and the amazing funky mixing style. I was hoping to find that again on the third cd while buying (ok the tracklisting already revealed that a bit).

So as said, this mix cd is full of (41 tracks) of funky and powerful techno. Not really the tribal techno as we knew from him some years ago but that’s part of the evolution in techno land.

I ordered the cd at juno and started listening and writing!

http://www.discogs.com/Ben-Sims-Ekspozicija-08-Escapism-Pt-2/release/1231675

01 BEN SIMS Intro
02 EDUCUTION Extravageansai (D1)
03 EDUCUTION Extravageansai (Mark Broom Edit) (D1)
04 JORIS VOORN Early Bird (Green)
05 ORLAND VOORN Teaser (Triangle)
06 K.C.L. PROJECT Wade In The River (re-edit) (Joss House)
07 2000 AND ONE Tropical Melons (100% Pure)
08 MARK BROOM Blue (Theory)
09 NORMAN CHUNG Sense (Sino)
10 PAUL MAC Elvis Beats (Stimulus)
11 NORMAN CHUNG F1 (Deetron Edit) (Sino)
12 BEN SIMS Welcome To The Club (Theory)
13 PB A Paco Di Bango’s World (Dub) (OV)
14 DJ FUNK Put Yo Back In To It (Dancemania)
15 TYREE COOPER Dancemania Mix 1 (Lone)
16 REDSHAPE Munch (Delsin)
17 LIGHTER THIEF Hero’s Return (Pure Plastic)
18 OCTAVE ONE Empower (Reconstruction Mix) (430 West)
19 DJ 3000 Sacred Time (Motech)
20 KILLA PRODUCTIONS Feelin’ Acid (KB Records Inc)
21 MARK BROOM Things (Ingoma)

22 JAMES RUSKIN Work (Steve Rachmad remix) (Blueprint)
23 RAY KAJIOKA Steam (Kanzleramt)
24 DAVID MOLEON Igriv (Moop Up)
25 KAZU KIMURA Native Rhythm (Remastered) (Symbolism)
26 PAUL MAC &MARK BROOM I Don’t Know (Pure Plastic)
27 XOX CREW 606 Outburst (Atom)
28 BEN SIMS Jack Up (Theory)
29 DOLBY B Speed Road (Theory)
30 HIDDEN RIVALS CC Feedback (EC)
31 MARK WILLIAMS The Game (Theory)
32 HIROAKI IIZUKA Java (Theory)
33 DJ FUNK Fuck Face Down (Dancemania)
34 DJ SKITZO Impact Zone(Paul Mac re-edit) (Theory)
35 KILLA PRODUCTIONS Feelin Acid 2 (KB Records Inc)
36 DJ RUSH Dance With Me (Paul Mac re-edit) (Theory)
37 KAZU KIMURA Bottom Heavy (Theory)
38 SHINEDOE Phunk (Intacto)
39 TAHO Detroit (Delsin)
40 DAVID F Memory Scan (Stimulus)
41 JAMES RUSKIN Lahain (Tresor)

Reviewing the mix

41 Tracks in the mix, only Jeff Mills, Richie Hawtin or hardcore dj’s are doing that too, and I love it! So I won’s discuss every track but more the phases of the cd.

The mix starts with an intro which is a nice flashback to Escapism part 1. Just after some talking the seconds track starts which is quite funky from the beginning. Nice track at position 4 from the Dutch guy Joris Voorn at his own Green label but from track 7 it becomes more techno-ish, btw a great track from 2000 and one. It was quite a popular track but that doesn’t matter to me at all. Track 8 gives you the typical Mark Broom sound, you’ll hear more tracks from him later.

Spoken about typical sounds, from here the real Ben Sims mixing style (for me allthough) starts. In my words, fast, funky and lots of faderviolence. Awesome! I was a bit surprised or maybe better, dissapointed about track 10 “Elvis beats”, I’ve heard track too many times now and it’s even not that special. But hey, every cd should have his less great tracks :) . One good thing, track 11 goes into the mix very fast (after 1:20) to Norman Chung – F1 (Deetron mix).

Track 14, DJ funk. Here starts a list of those typical “Ghetto techno” tracks which you’ll get in almost every Sims mix. It’s a nice break with dirty sounds and break beats. And before you know you’re already listening to track 17 where the real techno comes back into the picture.

Next track (18) from Octave one is awesome, Sims should have taken a bit more time for this track (just because I like it). It reminds me of an amazing Awakening edition in March 2008 where Octave one was playing live [click], 2 guys going crazy in a live set where they end up mixing standing on the table!

Track 21 and 22 are lifting up tempo, 21 contains a great vocal and that vocal is almost continueing to track 23, this is a nice example of three decks mixing and definitely not the only one. While drinking a little bit of my coffee (yes, making notes while listening :) ), we’re already listening to track 25. What a mixing speed.

Now the tempo is going down a bit in track 25 till 31, silence for the storm probably.

And yes! track 32 introduces a new part of this mix, in no time track 33 is in the mix and we’re lifting up! Track 34 again a Paul mac re-edit (Paul Mac, Mark Broom and James Ruskin are well presented on this cd) We’re into the more uptempo songs now. Track 38 from Shinedoe (she’s great, the fuse presents Shinedoe cd is almost grey now (if that was possible with cd’s :) ).

Last two tracks on the labels Stimulus and Tresor are the more dark tracks to give this mix a nice outro.

Conclusion, worth every penny (or Euro). Nice powerful mix but not really outstanding. If I should rate it with a number from 1 to 10, a 7,5 for me.

Share and Enjoy:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • DZone
  • RSS
  • Twitter

Discogs profile complete

By Rob, February 14, 2009 5:13 pm

After some hours of searching and clicking at discogs, my whole collection of cd’s is added. Well, not all, 8 cd’s are left because they didn’t exist (yet), so I’ll contribute them later. One of the disadvantages of clicking around in discogs, is that you notice that there are even more awesome cd’s :) , and even some of them are for sale!

The result:
collection: 415
wantedlist: 93

I think that my wantedlist contained about 50 items before updating my collection…..

So this morning I was (again) surfing in the discogs marketplace which resulted in 17 new items:

  • Steve Rachmad – Emerging (CD, Mixed, Comp)
  • Marco Remus / DJ Rush – Essential Underground Vol. 02: Berlin / Chicago (2xCD, Mixed, Comp)
  • Various – Turn Up The Bass – Volume 1 (CD, Comp)
  • Various – Turn Up The Bass – Volume 4 (CD)
  • Various – Turn Up The Bass – Volume 5 (CD)
  • Various – Turn Up The Bass – Volume 7 (CD)
  • Various – Turn Up The Bass – Volume 8 (CD)
  • Various – Turn Up The Bass – Volume 11 (CD)
  • Various – Turn Up The Bass – Volume 12 (CD)
  • Various – Turn Up The Bass – Volume 25 (CD)
  • Various – A Nightmare In Rotterdam Part Four – The Ultimate Hardcore Compilation
  • Carl Cox – F.A.C.T. 2 (2xCD)
  • Timo Maas – Music For The Maases 2 (CD + DVD)
  • DJ Rob / DJ Paul* – House Party 12 – The ’94 Summer Of Love Edition – The Hardcore Ravemix (CD, Mixed, Comp)
  • Mijk Van Dijk / Toby Izui – Essential Underground Vol. 01: Berlin / Tokyo (2xCD)
  • Monika Kruse – On The Road Vol. 1 (CD)
  • Carl Cox – F.A.C.T. (2xCD, Comp, Mixed)

Quite some old ones this time, now I’ve got only three items left from the Turn Up The Bass collection :) (except for all those megamix editions which I’m not really interested in). I’ll remove them from my wantlist once I receive them this week.

Oh and for the record, I bought two cd’s this week at the Dutch frs. 2 Nice-to-have albums for 15 euro:

  • Chemical Brothers – Push the button
  • Daft Punk – Human after all

About Daft Punk, I heard that there’s a new album coming called Electroma. You can listen to some (nice) samples already at youtube

Stay tuned for hopefully my first album/cd review later this week.

Share and Enjoy:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • DZone
  • RSS
  • Twitter

Panorama Theme by Themocracy