SpringBoot Caffeine cache with PostgreSQL backend

Performance is a big problem in software development. And Caching is one solution to speed up system. In the tutorial, JavaSampleApproach will show you how to use SpringBoot Caffeine cache with PostGreSQL backend.

Related posts:
How to work with Spring Cache | Spring Boot
Couchbase – How to create Spring Cache Couchbase application with SpringBoot
SpringBoot Hazelcast cache with PostgreSQL backend

I. Technologies

– Java 1.8
– Maven 3.3.9
– Spring Tool Suite – Version 3.8.1.RELEASE
– Spring Boot: 1.5.6RELEASE
– Couchbase 4.6.2

II. SpringBoot Caffeine cache

What is Caffeine cache?

In the org.springframework.boot.autoconfigure.cache.CacheProperties, we can see:


[..]

@ConfigurationProperties(prefix = "spring.cache")
public class CacheProperties {
	[..]
	
	/**
	 * Guava specific cache properties.
	 */
	public static class Guava {
		
		@Deprecated
		@DeprecatedConfigurationProperty(reason = "Caffeine will supersede the Guava support in Spring Boot 2.0", replacement = "spring.cache.caffeine.spec")
		public String getSpec() {
			return this.spec;
		}

		@Deprecated
		public void setSpec(String spec) {
			this.spec = spec;
		}

[..]

-> Caffeine is a Java 8 rewrite of Guava’s cache that supersede the Guava support.

In the tutorial, we use SpringBoot and Caffeine cache with PostGreSQL backend as below architecture:

Springboot Caffeine Cache - architecture

For work with SpringCache Caffeine, we need dependencies:

<!-- Spring Framework Caching Support -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-cache</artifactId>
 </dependency>

 <!-- caching provider -->
 <dependency>
     <groupId>com.github.ben-manes.caffeine</groupId>
     <artifactId>caffeine</artifactId>
 </dependency>

If Caffeine is present, spring-boot-starter-cache ‘Starter’ will auto-configure a CaffeineCacheManager. Caches can be created on startup using the spring.cache.cache-names. We can cutomize a cache via properties in order:
1. A cache spec defined by spring.cache.caffeine.spec
2. A com.github.benmanes.caffeine.cache.CaffeineSpec bean is defined
3. A com.github.benmanes.caffeine.cache.Caffeine bean is defined

More details, we need check out the sourcecode of com.github.benmanes.caffeine.cache.CaffeineSpec or
com.github.benmanes.caffeine.cache.Caffeine:


...

public final class CaffeineSpec {
 
  ...
  
  long maximumSize = UNSET_INT;
  long maximumWeight = UNSET_INT;
 
  ...

  long expireAfterAccessDuration = UNSET_INT;
  long expireAfterWriteDuration = UNSET_INT;
  long refreshAfterWriteDuration = UNSET_INT;
  
...

Explanation:
maximumSize: Specifies the maximum number of entries the cache may contain
maximumWeight: Specifies the maximum weight of entries the cache may contain
expireAfterAccessDuration: Specifies that each entry should be automatically removed from the cache once a fixed duration has elapsed after the entry’s creation, the most recent replacement of its value, or its last read.
expireAfterWriteDuration: Specifies that each entry should be automatically removed from the cache once a fixed duration has elapsed after the entry’s creation, or the most recent replacement of its value.
refreshAfterWriteDuration: Specifies that active entries are eligible for automatic refresh once a fixed duration has elapsed after the entry’s creation, or the most recent replacement of its value.

Example:


spring.cache.cache-names:customer
spring.cache.caffeine.spec: maximumSize=500, expireAfterAccess=86400s

III. Practice

In the tutorial, we create a SpringBoot project as below:

Springboot Caffeine Cache - project structure

Step to do:
– Create SpringBoot project
– Create data model
– Create Repository
– Implement Service on top of Cache
– Implement RestAPIs
– Implement CommandLineRunner to init data
– Configuration
– Run and check results

1. Create SpringBoot project

Using SpringToolSuite to create a SpringBoot project, then add dependencies:


[...]
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Framework Caching Support -->
 <dependency>
	 <groupId>org.springframework.boot</groupId>
	 <artifactId>spring-boot-starter-cache</artifactId>
 </dependency>

 <!-- caching provider -->
 <dependency>
	 <groupId>com.github.ben-manes.caffeine</groupId>
	 <artifactId>caffeine</artifactId>
 </dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
	<groupId>org.postgresql</groupId>
	<artifactId>postgresql</artifactId>
	<scope>runtime</scope>
</dependency>

[...]

2. Create data model

– Create a Customer model:


package com.javasampleapproach.caffeinecache.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "customer")
public class Customer {
	@Id
	private String id;
	
	@Column(name = "firstname")
	private String firstName;
 
	@Column(name = "lastname")
	private String lastName;
	
	public Customer(){
	}
	
	public Customer(String id, String firstName, String lastName){
		this.id = id;
		this.firstName = firstName;
		this.lastName = lastName;
	}
	
	public String getId() {
		return this.id;
	}
 
	public void setId(String id) {
		this.id = id;
	}
 
	public String getFirstName() {
		return this.firstName;
	}
 
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
 
	public String getLastName() {
		return this.lastName;
	}
 
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
 
	@Override
	public String toString() {
		return String.format("Customer[ id=%s, firstName=%s, lastName=%s]", this.id, this.firstName, this.lastName);
	}
}

3. Create Repository

– Using CrudRepository, create a interface CustomerRepository:


package com.javasampleapproach.caffeinecache.repo;

import org.springframework.data.repository.CrudRepository;

import com.javasampleapproach.caffeinecache.model.Customer;

public interface CustomerRepository extends CrudRepository{
}

4. Implement Service on top of Cache

Implement a cache component CustomerCache as below:


package com.javasampleapproach.caffeinecache.service.cache;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

import com.javasampleapproach.caffeinecache.model.Customer;
import com.javasampleapproach.caffeinecache.repo.CustomerRepository;

@Component
@CacheConfig(cacheNames = {"customer"})
public class CustomerCache {
	
	@Autowired
	CustomerRepository customerRepository;
	
	@Cacheable(key="#id")
    public Customer getOnCache(String id){
    	System.out.println("############# Backend processing...");
    	
    	// simulation the time for processing
    	try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
		}
    	
    	return customerRepository.findOne(id);
    }
	
	@CachePut(key="#id")
    public Customer putOnCache(String firstName, String id){
		// find a customer in repository
		Customer cust = customerRepository.findOne(id);
		
		// modify above customer by first-name
		cust.setFirstName(firstName);
		
		// save to database
        return customerRepository.save(cust);
    }
     
    @CacheEvict(key = "#id")
    public void evict(String id){
    }
}

Then implement CustomerServices service on top of CustomerCache:


package com.javasampleapproach.caffeinecache.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.javasampleapproach.caffeinecache.model.Customer;
import com.javasampleapproach.caffeinecache.service.cache.CustomerCache;
 
@Service
public class CustomerServices {
	
	@Autowired
	CustomerCache customerCache;
	
    public Customer putCustomer(String firstName, String id){
        return customerCache.putOnCache(firstName, id);
    }
     
    public Customer get(String id){
    	return customerCache.getOnCache(id);
    }
     
    public void evict(String id){
    	customerCache.evict(id);
    }
}

5. Implement RestAPIs

Create a WebController with 3 APIs {/api/cachable, /api/cacheput, /api/cacheevict}:


package com.javasampleapproach.caffeinecache.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.javasampleapproach.caffeinecache.model.Customer;
import com.javasampleapproach.caffeinecache.service.CustomerServices;

@RestController
@RequestMapping("/api")
public class WebController {
     
    @Autowired
    CustomerServices service;
     
    @RequestMapping("/cachable")
    public Customer get(@RequestParam("id")String id){
        return service.get(id);
    }
    
    @RequestMapping("/cacheput")
    public String put(@RequestParam("firstname") String firstName, @RequestParam("id")String id){
        service.putCustomer(firstName, id);
        return "Done";
    }
     
    @RequestMapping("/cacheevict")
    public String evict(@RequestParam("id")String id){
        service.evict(id);
        return "Done";
    }
     
}

6. Implement CommandLineRunner to init data

In main class, use CustomerRepository and CommandLineRunner to init data:


package com.javasampleapproach.caffeinecache;

import java.util.Arrays;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

import com.javasampleapproach.caffeinecache.model.Customer;
import com.javasampleapproach.caffeinecache.repo.CustomerRepository;

@EnableCaching
@SpringBootApplication
public class SpringBootCaffeineCacheApplication implements CommandLineRunner{

	@Autowired
	CustomerRepository customerRepo;
	
	public static void main(String[] args) {
		SpringApplication.run(SpringBootCaffeineCacheApplication.class, args);
	}

	@Override
	public void run(String... arg0) throws Exception {
		// initial data to PostGreSQL database 
		customerRepo.save(Arrays.asList(new Customer("1", "Jack", "Smith"), 
											new Customer("2", "Adam", "Johnson")));
	}
}

Note: @EnableCaching is used to enable caching.

7. Configuration

Open application.properties file, configure spring.cache.* and spring.datasource.*


spring.cache.cache-names:customer
spring.cache.caffeine.spec: maximumSize=500, expireAfterAccess=86400s

spring.datasource.url=jdbc:postgresql://localhost/testdb
spring.datasource.username=postgres
spring.datasource.password=123
spring.jpa.generate-ddl=true

8. Run and check results

Build and Run the SpringBoot project as commandlines: {mvn clean install, mvn spring-boot:run}.

-> See PostgreSQL database:

Springboot Caffeine Cache - database initial

– Make request 1: http://localhost:8080/api/cachable?id=1

-> Results:
Service process slowly and,

Springboot Caffeine Cache - request 1

Server has displayed a text on console:


############# Backend processing...

– Make request 2: http://localhost:8080/api/cachable?id=1
Now the response is faster because Customer with id = 1 has been cached before, the application just get data from cache storage.

Springboot Caffeine Cache - request 1

– Make request 3: http://localhost:8080/api/cacheput?id=1&firstname=Peter
Message is returned on Browser:
Done
Now customer with id=1 is modified: firstname=’Peter’, NOT ‘Jack’.

– Make request 4: http://localhost:8080/api/cachable?id=1
Response is faster BUT the result is difference from first request:

Springboot Caffeine Cache - request 4

– Make request 5 – Make a cache-evict request: http://localhost:8080/api/cacheevict?id=1
Browser displays:
Done
Now customer with id=1 was evicted from cache storage.

– Make request 6: http://localhost:8080/api/cachable?id=1
Now the behavior of the browser is the same as the first request because customer with id=1 was evicted to cache, and the method under @Cachable is executed.
Service process slowly and result:


############# Backend processing...

Springboot Caffeine Cache - request 4

IV. Sourcecode

SpringBootCaffeineCache

110 thoughts on “SpringBoot Caffeine cache with PostgreSQL backend”

  1. Wonderful beat ! I would like to apprentice while you amend your web site, how can i subscribe for a
    blog web site? The account aided me a acceptable deal.
    I had been a little bit acquainted of this your broadcast offered bright clear
    concept

  2. Hеy there! I јust want to give ʏou a big thumbs up for the excellent
    informatіon yoߋu have got here ߋn this post. I’ll bee coming baск to yoսr blog fⲟr more soon.

  3. That is really interesting, You’re a very professional
    blogger. I’ve joined your feed and look ahead to looking for
    more of your great post. Additionally, I’ve shared your website
    in my social networks

  4. Wonderful blog! Do you have any hints for aspiring writers?
    I’m planning to start my own site soon but I’m a
    little lost on everything. Would you suggest starting
    with a free platform like WordPress or go for a paid option? There are so many options out there that
    I’m totally overwhelmed .. Any ideas? Kudos!

  5. Hello just wanted to give you a quick heads up. The words in your post
    seem to be running off the screen in Internet explorer. I’m not sure if this is a formatting issue or something to do with internet browser compatibility but
    I figured I’d post to let you know. The design look great though!
    Hope you get the problem solved soon. Kudos

  6. Thank you for another wonderful article. The place else could anybody get that kind of information in such a perfect means
    of writing? I’ve a presentation next week, and I am at the search for such info.

  7. Oh my goodness! Amazing article dude! Thank you, However
    I am going through difficulties with your RSS.
    I don’t know the reason why I can’t join it. Is there anybody else having similar RSS issues?
    Anybody who knows the solution will you kindly respond? Thanks!!

  8. Sweet blog! I found it while browsing on Yahoo News.
    Do you have any tips on how to get listed in Yahoo News? I’ve been trying for a while
    but I never seem to get there! Appreciate it

  9. Αn ⲟutstanding share! І’ve juust forwarded thiѕ onto a frіend who has
    been doing a little research on this. Ꭺnd he in fаct boᥙght me dinner duee too the fact that I found it f᧐r him…
    ⅼol. So let me reword thiѕ…. Thank YOU for the meaⅼ!!

    But yeah, tһanx foг spending time to dioscuss this
    topic here on your sіte.

  10. Hi, i think that i saw you visited my sіte thus i came to
    “retսrn the favor”.I am trying too find thіngs
    to imⲣrove my web site!I suppose its ok to usee some of
    yⲟսr ideas!!

  11. Sweet blog! I found it while browsing on Yahoo News.
    Do you have any suggestions on how to get
    listed in Yahoo News? I’ve been trying for a while but I never seem to get there!
    Appreciate it

  12. Have you ever thought about creating an e-book or guest authoring on other blogs?
    I have a blog based on the same ideas you discuss and would love to have you share some stories/information. I know
    my subscribers would enjoy your work. If you’re even remotely
    interested, feel free to shoot me an e mail.

  13. hello there and thank you for your information – I’ve
    definitely picked up something new from right here.

    I did however expertise several technical issues using this website, as I experienced
    to reload the web site a lot of times previous to I
    could get it to load properly. I had been wondering if your hosting is OK?
    Not that I’m complaining, but slow loading instances times will sometimes affect your placement in google and
    could damage your high quality score if ads and marketing with Adwords.
    Well I’m adding this RSS to my email and can look out for a lot more of your respective intriguing content.
    Ensure that you update this again very soon.

  14. Whats up this is kind of of off topic but I was wondering if blogs use WYSIWYG editors or if you have to
    manually code with HTML. I’m starting a blog soon but have no coding skills so I wanted to get advice from someone with experience.
    Any help would be greatly appreciated!

  15. I’m not sure exactly why but this web site is loading very slow for
    me. Is anyone else having this issue or is it a problem on my end?

    I’ll check back later on and see if the problem still exists.

  16. Hi, i read your blog from time to time and i own a similar one and i was just curious if you get
    a lot of spam remarks? If so how do you stop it,
    any plugin or anything you can suggest? I get so much lately it’s
    driving me mad so any support is very much appreciated.

  17. Excellent post but I was wanting to know if you could write
    a litte more on this subject? I’d be very grateful if you could elaborate a little bit more.
    Many thanks!

  18. I don’t know whether it’s just me or if everybody else encountering problems with your site.
    It appears as if some of the text in your posts are running off the screen. Can someone
    else please provide feedback and let me know if this is happening to them
    too? This could be a problem with my web browser because I’ve had this happen previously.

    Many thanks

  19. You really make it seem so easy with your presentation but I find this topic to be really something which I think I would never understand.
    It seems too complex and extremely broad for me.
    I’m looking forward for your next post, I will
    try to get the hang of it!

  20. Wow that was unusual. I just wrote an very long comment but after I clicked submit my comment didn’t
    appear. Grrrr… well I’m not writing all that over again. Regardless, just
    wanted to say wonderful blog!

  21. Hi there, I discovered your site via Google at the same time as searching
    for a related topic, your website came up, it seems to be good.
    I have bookmarked it in my google bookmarks.

    Hi there, just turned into alert to your blog via Google,
    and located that it’s really informative. I’m going to
    be careful for brussels. I will appreciate in the event you proceed this in future.
    Many other folks will be benefited from your writing.
    Cheers!

  22. I’ll right away take hold of your rss as I can not to find your email subscription hyperlink or e-newsletter service.
    Do you have any? Please let me know in order that I may subscribe.
    Thanks.

  23. I don’t even understand how I stopped up here, however I
    assumed this publish was once great. I don’t realize who you’re
    however certainly you’re going to a well-known blogger in the event
    you are not already. Cheers!

  24. Thanks for the good writeup. It in fact was once a entertainment account it.
    Look complicated to more introduced agreeable from you!

    By the way, how can we be in contact?

  25. Great web site you have got here.. It’s difficult to find excellent writing like yours nowadays.
    I honestly appreciate individuals like you! Take care!!

  26. Write more, thats all I have to say. Literally,
    it seems as though you relied on the video to make your point.
    You definitely know what youre talking about, why throw away
    your intelligence on just posting videos to your site when you could be giving us something informative to
    read?

  27. Its such as you read my mind! You seem to grasp a lot approximately this, like
    you wrote the guide in it or something. I think that
    you just can do with some p.c. to drive the message house a
    bit, but other than that, that is wonderful blog. An excellent read.
    I will certainly be back.

  28. Howdy would you mind stating which blog platform you’re using?
    I’m looking to start my own blog in the near future but
    I’m having a difficult time deciding between BlogEngine/Wordpress/B2evolution and Drupal.

    The reason I ask is because your layout seems different then most
    blogs and I’m looking for something completely unique.
    P.S My apologies for being off-topic but I had to ask!

  29. Wonderful beat ! I wish to apprentice while you amend your site, how can i subscribe for a weblog
    website? The account helped me a acceptable deal. I had been a little bit familiar of this
    your broadcast offered vibrant transparent concept

  30. Wow, wonderful weblog layout! How lengthy have you ever been running a blog for?
    you made running a blog look easy. The total look of your site is fantastic, let alone the content!

  31. I tһhink whаt you ѕaid made a great deal
    of sense. However, think onn this, suppose you were
    to create a killker headline? I am not suggeѕting your contеnt isn’t solid,
    howwver wһat if you addeⅾ a post title that ցrabbed people’s attention? I
    mean ozenero | Mobile & Web Programming Tutorials
    is a little vanilla. You might peek at Yahoo’s front аge and see how they create ɑrticle
    headlines tο get peoрle to click. Yoou might add a related video or a
    related pic oг two to get peopple interested about what you’ve written.
    Just my opinion, iit would ƅring your postѕ a little ⅼіvelier.

  32. My brother suggested I might like this web site.
    He was entirely right. This post actually made my day.
    You can not imagine just how much time I
    had spent for this information! Thanks!

  33. I’m no longer positive where you’re getting your info, but good topic.
    I must spend a while learning more or working out more.

    Thank you for great information I used to be on the lookout for this information for my mission.

  34. Thanks for another fantastic article. Where else may just anyone get
    that kind of info in such a perfect manner of writing?

    I’ve a presentation subsequent week, and I am at the look for such info.

  35. Pretty nice post. I just stumbled upon your blog and wanted to
    mention that I’ve truly enjoyed browsing your weblog posts.
    In any case I’ll be subscribing for your feed and I’m
    hoping you write once more soon!

  36. Sweet blog! I found it while searching on Yahoo News.
    Do you have any tips on how to get listed in Yahoo News?
    I’ve been trying for a while but I never seem to get there!

    Thank you

  37. Hi, i think that i saw you visited my web site so i came to go back the favor?.I’m attempting to find things to
    enhance my site!I suppose its adequate to make use of a few of your concepts!!

  38. Your style is really unique in comparison to other folks
    I have read stuff from. Thank you for posting when you have the opportunity, Guess I’ll just bookmark this web site.

  39. hello!,I love your writing so much! proportion we keep up a correspondence more approximately your post on AOL?
    I require an expert in this area to unravel my problem.
    May be that is you! Looking ahead to peer you.

  40. I loved as much as you will receive carried out right here.
    The sketch is attractive, your authored subject matter stylish.
    nonetheless, you command get bought an impatience over that you wish be delivering the following.
    unwell unquestionably come more formerly again since exactly the
    same nearly a lot often inside case you shield this hike.

  41. I’ve been surfing online greater than 3 hours lately, but I by no means discovered any fascinating article like yours.

    It is pretty price enough for me. In my opinion, if
    all web owners and bloggers made excellent content as
    you probably did, the internet will probably
    be much more helpful than ever before.

  42. I know this if off topic but I’m looking into starting my own blog and
    was curious what all is required to get setup? I’m
    assuming having a blog like yours would cost a pretty penny?
    I’m not very internet savvy so I’m not 100% certain. Any suggestions or advice
    would be greatly appreciated. Thank you

  43. You actually make it seem so easy with your presentation but I find this matter to be actually something which
    I think I would never understand. It seems too complicated and very broad for me.

    I’m looking forward for your next post, I’ll try to get the hang of it!

  44. Thank you for the good writeup. It actually used to be a amusement account
    it. Look complex to far introduced agreeable from you!

    However, how can we keep up a correspondence?

  45. Hello, i feel that i noticed you visited my website thus i came to go back the
    favor?.I’m trying to in finding things to improve
    my site!I guess its good enough to use a few of your ideas!!

  46. Fantastic beat ! I would like to apprentice whilst you
    amend your website, how could i subscribe for a weblog site?
    The account aided me a applicable deal. I were a little bit acquainted of this your broadcast offered brilliant transparent concept

  47. An impressive share! I’ve just forwarded this onto a coworker who has been doing a little research
    on this. And he actually bought me lunch simply because I stumbled upon it for him…
    lol. So let me reword this…. Thanks for the meal!!

    But yeah, thanx for spending some time to discuss this
    matter here on your blog.

  48. You could definitely see your skills within the work you write.
    The sector hopes for more passionate writers such as
    you who are not afraid to mention how they believe.
    All the time follow your heart.

  49. I’m amazed, I must say. Seldom do I encounter a blog that’s
    equally educative and interesting, and without a doubt, you have hit the nail
    on the head. The problem is an issue that too few folks are speaking
    intelligently about. I am very happy I came across this during
    my search for something concerning this.

  50. Simply want to say your article is as astonishing.
    The clarity in your post is simply excellent and i can assume you’re
    an expert on this subject. Well with your permission let me to grab
    your feed to keep updated with forthcoming post. Thanks a million and please carry on the enjoyable work.

  51. Hi! I’ve been following your weblog for some time now and finally got the bravery to go ahead and give you a shout out from
    Lubbock Texas! Just wanted to mention keep up the great
    work!

  52. Howdy I am so happy I found your web site, I really found you by accident,
    while I was searching on Yahoo for something else, Anyhow
    I am here now and would just like to say thanks a lot for a
    remarkable post and a all round enjoyable blog (I also love the
    theme/design), I don’t have time to read it all at the moment but
    I have book-marked it and also included your RSS feeds, so when I have time I will
    be back to read a lot more, Please do keep up the excellent jo.

  53. Very great post. I simply stumbled upon your blog and wished to mention that I’ve really enjoyed
    browsing your weblog posts. After all I’ll
    be subscribing on your feed and I am hoping you write
    once more very soon!

  54. Just want to say your article is as surprising. The clarity in your post is simply
    spectacular and i could assume you’re an expert on this
    subject. Fine with your permission allow me to grab your
    feed to keep updated with forthcoming post.
    Thanks a million and please keep up the gratifying work.

  55. I think this is among the most vital information for me. And i’m
    glad reading your article. But wanna remark on few general things, The website style is
    ideal, the articles is really nice : D. Good job, cheers

  56. Hello, i think that i saw you visited my weblog so i came to
    “return the favor”.I am attempting to find things
    to enhance my site!I suppose its ok to use a few of your ideas!!

  57. Hey! This is my first comment here so I just wanted to give a
    quick shout out and say I truly enjoy reading your blog posts.
    Can you recommend any other blogs/websites/forums that deal with the same topics?
    Thanks for your time!

  58. My coder is trying to convince me to move to .net from PHP.
    I have always disliked the idea because of the expenses.

    But he’s tryiong none the less. I’ve been using WordPress on a number of websites for about a year and am anxious about switching to another platform.
    I have heard very good things about blogengine.net. Is there a
    way I can transfer all my wordpress content into it? Any help would
    be really appreciated!

  59. Nice post. I used to be checking continuously this blog and
    I am impressed! Very helpful information specifically the last phase
    🙂 I care for such information a lot. I was looking for this particular info for a long time.
    Thank you and good luck.

  60. I got this site from my pal who shared with me about this web site and at the moment this
    time I am visiting this website and reading very informative articles
    here.

  61. You really make it appear so easy along with your presentation however I find this matter to be
    really one thing that I feel I’d never understand. It sort of feels
    too complicated and extremely huge for me. I am taking a look forward on your subsequent publish, I will attempt to
    get the dangle of it!

  62. I must thank you for the efforts you have put in penning this website.
    I really hope to check out the same high-grade content by you in the future as well.
    In fact, your creative writing abilities has motivated me to get my very own website now 😉

  63. Excellent post. I used to be checking constantly this blog and I am impressed!

    Very helpful information specially the ultimate part 🙂 I maintain such information much.

    I was looking for this particular information for a long time.
    Thank you and best of luck.

  64. hi!,I like your writing very a lot! percentage we keep
    up a correspondence extra approximately your post on AOL? I require an expert
    in this house to solve my problem. May be that’s you!
    Having a look forward to peer you.

  65. Howdy! Would you mind if I share your blog with my zynga group?
    There’s a lot of folks that I think would really enjoy your
    content. Please let me know. Thank you

  66. Hello! This post could not be written any better! Reading this post reminds me
    of my old room mate! He always kept chatting about this. I will forward this article
    to him. Fairly certain he will have a good read.
    Thanks for sharing!

  67. Hi, I do think this is a great site. I stumbledupon it 😉 I
    am going to revisit once again since i have book-marked it.
    Money and freedom is the greatest way to change,
    may you be rich and continue to help others.

  68. Thanks for your marvelous posting! I really enjoyed reading it,
    you will be a great author.I will remember to bookmark your blog and will eventually come back later in life.

    I want to encourage yourself to continue your great writing, have a nice evening!

Leave a Reply

Your email address will not be published. Required fields are marked *