Thursday, 30 May 2013
Introducing JPA Cache Store
Good news everyone - Infinispan 5.3.0 will be introducing a long awaited JPA cache store. This cache store will allow you to store cache entries in the database using proper schema - so that other applications can read the persisted data as well.
In normal use cases, it’s recommended to leverage Infinispan as JPA second level cache and/or query cache. However, if you’d like to use only Infinispan API and you want Infinispan to read from database, or to persist the data into a database with well defined schema, then JPA cache store could be right for you.
Prior to JPA cache store, those who wants to use Infinispan in front of a database to read/write database records would need to write their own cache store implementation. Now, with JPA cache store, users can use Infinispan in front of a database (write-through or write-behind) with ease by using standard JPA mapping and configurations.
To use the cache store is simple - create the standard JPA configuration (persistence.xml) and entity class, and then configure the cache store:
Please see documentations for detailed sample usage and configuration.
Hope you enjoy this new addition!
Ray
Tags: jpa hibernate cache store
Friday, 31 August 2012
Configuration overhaul
Infinispan 5.2 will sport a much needed configuration overhaul which will affect both the programmatic builder API and the declarative XML parsing.
As you all know by now, 5.1 introduced a new fluent builder-based API with immutable POJOs for configuring Infinispan’s core. This coolness however was not extended to all the extra modules available for Infinispan (and there are quite a few of those), leaving them with a simple untyped key/value properties-based configuration. This was especially visible (and painful) when configuring the cache loaders, some of which have a plethora of parameters and options.
In 5.2 modules become first-class citizens and can provide their own builders and can take care of parsing their own XML for which they can provide a custom schema (for editors/IDE which provide content-assist). Modules can retrieve information from either the GlobalConfiguration or the per-cache Configuration objects via the T modules(Class<T> moduleClass) method.
Loaders and Stores also get this treatment. Look at the two before and after configurations below for configuring the JDBC Cache Store.
Before:
After:
You will be able to check-out these features in Infinispan 5.2.0.Alpha3. Bear in mind that at the time of writing not all cache loaders have been migrated to this new configuration style, but they should all be complete by the time 5.2.0.Final is released.
If you want to learn how to extend Infinispan’s configuration for your own modules, head over to ExtendingInfinispansConfiguration which should provide all the information you need
Tags: xsd configuration cache store
Monday, 23 July 2012
Infinispan 5.2.0.ALPHA2 is here!
Infinispan 5.2.0.ALPHA2 was released last Friday with several additions for those that like to test Infinispan’s bleeding edge capabilities. In this case, it’s out Map/Reduce functionality that’s the star of the show:
Vladimir Blagojevic, one of our Infinispan developers, will be explaining all about these features in a blog post coming right up, so stay tuned! :)
Finally Adrian Nistor, the latest addition to the Infinispan team, has been working on reducing the size of our distribution files by avoiding duplication of jars.
Cheers,
Galder
Tags: release alpha map reduce cache store
Thursday, 31 May 2012
Infinispan 5.1.5 goes FINAL!
Infinispan 'Brahma' 5.1.5.FINAL has now been released fixing a whole bunch of issues around cache store preloading of distributed caches, Memcached server, tree module and Hot Rod client performance. We’ve also updated several libraries such as Netty (to 3.4.6) and JGroups (to 3.0.10).
Full details of what has been fixed can be found here, and if you have feedback, please visit our forums. Finally, as always, you can download the release from here.
Cheers, Galder
Tags: release hotrod memcached jgroups cache store netty
Thursday, 24 May 2012
How to configure Infinispan with transactions, backed by relational DB on JBoss AS 7 vs. Tomcat 7
Migrating projects from one container to another is often problematic. Not as much with Infinispan. This article is about configuring Infinispan, using Transaction Manager for demarcating transaction boundaries, while keeping the data both in a memory and relational database - stored via JDBC cache store. I’ll demonstrate all the features on code snippets.
A complete application is located at https://github.com/mgencur/infinispan-examples and is called carmart-tx-jdbc. It’s a web application based on JSF 2, Seam 3 and Infinispan 5.1.4.FINAL, is fully working, tested with JBoss Application Server 7.1.1.Final and Tomcat 7.0.27. There is one prerequisite, though. It needs an installed and working MySQL database in your system. The database name should be carmartdb, accessible by a user with carmart/carmart username/password. First, look at what we need to configure for JBoss Application Server 7.
Configuring transactions and JDBC cache store on JBoss AS 7
Infinispan will be configured via new fluent API using builders, hence the call to .build() method at the end. We need to configure aspects related to transactions and cache loaders. The configuration API for cache loaders is likely going to be changed in not-so-far future. It should be fluent and more intuitive, generally easier to use than current one.
I purposely do not show XML configuration. Configuration examples can be found at https://github.com/infinispan/infinispan/blob/master/core/src/main/resources/config-samples/sample.xml. In order to configure transactions and cache loaders, look for tags called <transaction> and <loaders> and modify that sample file according to below configuration. Tag names and attribute names are very similar for both XML and Java configuration. If that is not enough, there is always a schema in Infinispan distribution.
The configuration of Infinispan is as follows:
Lines marked with red are different in other containers/configurations, as you’ll see in a minute. The code above implies that we need to specify proper TransactionManagerLookup implementation which is, in this case, GenericTransactionManagerLookup. We also need to say: "Hey, I wanna use ManagedConnectionFactory as a connectionFactoryClass". OK, here we go. I should, as well, explain how to configure a datasource properly, right? In JBoss AS 7, this is configured as a subsystem in $JBOSS_HOME/standalone/configuration/standalone.xml:
The usage of transactions is very simple as we can obtain a transaction object by injection.
Quite easy, isn’t it …if you know how to do it. The only problem is that it does not work (at least not completely) :-) If you deploy the app, you find out that when storing a key-value pair in the cache, an exception is thrown. This exception indicates that the operation with DB (and JDBC cache store) failed. The exception says:
A complete stack trace looks similar to https://gist.github.com/2777348 There’s still an open issue in JIRA (ISPN-604) and it is being worked on.
Configuring transactions and JDBC cache store on JBoss AS 7 - c3p0
But how do we cope with this inconvenience for now… By not using a managed datasource but rather a third party library called c3p0 (JDBC3 Connection and Statement Pooling, more information at http://www.mchange.com/projects/c3p0/index.html) Infinispan allows you to use this library for connecting to the database. If you really want to use it, you need to choose a different connectionFactoryClass which is, in this case, PooledConnectionFactory.
Infinispan configuration looks like this:
Transactions are accessible in the same way as in the previous use case. Now let’s look at configuration for Tomcat servlet container.
Configuring transactions and JDBC cache store on Tomcat 7
Tomcat does not have any Transaction Manager in it so we have to bundle one with the application. For the purpose of this exercise, we choose JBoss Transactions (http://www.jboss.org/jbosstm). See dependencies at the end.
Cache manager and cache configuration is in this form:
For Tomcat, we need to specify a different transactionManagerLookup implementation and datasourceJndiLocation. Tomcat simply places objects under a bit different JNDI locations. The datasource is defined in context.xml file which has to be on classpath. This file might look like this:
How do we get the transaction manager in the application then? Lets obtain it directly from a cache.
Infinispan knows how to find the manager and we need to know how to obtain it from Infinispan.
Sources: https://github.com/mgencur/infinispan-examples/blob/master/carmart-tx-jdbc/src/tomcat/java/org/infinispan/examples/carmart/session/CarManager.java The transaction manager provides standard methods for transactions, such as begin(), commit() and rollback().
Now is the time for dependencies
So…which dependencies do we always need when using Infinispan with JDBC cache stores and transactions? These are infinspan-core, infinispan-cachestore-jdbc and javax.transaction.jta. The scope for jta dependency, as defined in Maven, is different for JBossAS and Tomcat.
Common dependencies for JBossAS and Tomcat
Of course, our application needs a few more dependencies but these are not directly related to Infinispan. Let’s ignore them in this article. JBoss AS 7 provides managed datasource that is accessible from Infinispan. The only specific dependency (related to transactions or Infinispan) is JTA.
Dependencies specific to JBossAS - using managed Datasource (managed by the server)
Dependencies specific to JBossAS - using c3p0
Yes, you need to bundle also MySQL connector. On the other hand, for Tomcat use case and JBossAS with managed datasource, this jar file needs do be deployed to the server separately. For Tomcat, do this simply by copying the jar file to $TOMCAT_HOME/lib. For JBoss AS 7, copy the jar file into $JBOSS_HOME/standalone/deployments.
Dependencies specific to Tomcat - using JBoss Transactions
That’s it. I hope you’ve found this article helpful. Any feedback is welcome, especially the positive one :-) If you find any problem with the application, feel free to comment here or participate in Infinispan forums (http://www.jboss.org/infinispan/forums).
Martin
Tags: database transactions c3p0 as7 cache store tomcat