Is is advisable to cache the "new IniialConext()" object and then using this one cached object for looking up Home Objects and DataSource Objects across the entire application.
Yep, I do it and it works well. Getting a new InitialContext each time would be fairly expensive.
A followup question: How does it work in a clustered environment?
Using a cached InitialContext within a clustered environment would rely on how your app server works. I have been using WebLogic and it allows you to specify the DNS name of your cluster when you create a Context, so if one machine goes down your Context will still be able to access the JNDI tree's from other servers.