[prev in list] [next in list] [prev in thread] [next in thread] 

List:       tomcat-user
Subject:    Re: Runtime Cloning of DataSource for Different DB?
From:       "Terence M. Bandoian" <terence () tmbsw ! com>
Date:       2016-06-29 17:24:52
Message-ID: 57740464.5030505 () tmbsw ! com
[Download RAW message or body]

On 6/29/2016 1:44 AM, Mark Thomas wrote:
> On 29/06/2016 05:12, Terence M. Bandoian wrote:
> > On 6/28/2016 3:56 AM, Mark Thomas wrote:
> > > On 27/06/2016 22:35, Jerry Malcolm wrote:
> > > > Mark,
> > > > 
> > > > On 6/27/2016 1:07 PM, Mark Thomas wrote:
> > > > > On 27/06/2016 17:44, Jerry Malcolm wrote:
> > > > > 
> > > > > > I'm assuming that context.lookup(...) simply locates the "jdbc/myDB"
> > > > > > <Resource> tag in the context.xml file, pulls all of the parms out of
> > > > > > that tag, creates a DataSource object utilizing the parms, and returns
> > > > > > it.    If that's the case, couldn't I create a variation/subclass
> > > > > > of the
> > > > > > Context object that modifies the url parm that it found in the
> > > > > > resource
> > > > > > tag and puts the desired db name into the url before constructing the
> > > > > > DataSource?
> > > > > Sure.
> > > > > 
> > > > > You need to implement the appropriate factory and then specify your
> > > > > factory class explicitly in the Resource element using the factory
> > > > > attribute.
> > > > > 
> > > > > You probably want to start here for ideas on how to code up your
> > > > > factory:
> > > > > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/naming/factory/
> > > > > 
> > > > > 
> > > > > or for a more specific example:
> > > > > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/dbcp2/BasicDataSourceFactory.java?view=annotate
> > > > >  
> > > > > 
> > > > > 
> > > > > 
> > > > > Mark
> > > > > 
> > > > Thanks so much.  This looks doable.  Just to make sure I have the big
> > > > picture correct....
> > > > 
> > > > 1) I will define a new custom resource that returns a custom context
> > > > object that I write.
> > > > 2) On the <Resource> tag for my custom context resource I can put all of
> > > > the standard DataSource parms
> > > > 3) I then call lookup() on this custom context passing the dbName in
> > > > 4) This custom context will build an appropriate Reference object with
> > > > all the parms, instantiate a BasicDataSourceFactory, and call
> > > > getInstance(.....) on the factory.
> > > > 
> > > > When I need an instance of the datasource:
> > > > Context initContext = new InitialContext();
> > > > Context envContext  =
> > > > (Context)initContext.lookup("java:/comp/env");
> > > > MyDataSourceContext dsContext = (MyDataSourceContext)
> > > > envContext.lookup( "dsContext/myDSContext" );
> > > > DataSource myDS = (DataSource) dsContext.getInstance(
> > > > "dbName" );
> > > > 
> > > > Am I getting close?
> > > Yes, but I don't think you want to use custom NamingContexts. I think
> > > there is a simpler way.
> > > 
> > > 1. Write a custom DataSource factory that provides a getDataSource(...)
> > > method that allows you to pass in whatever per instance config you need.
> > > This DataSource factory will need to use bean style setters (like the
> > > example I linked to) to pick up the other config from the <Resource .../>
> > > 
> > > 2. Write a custom resource factory that returns an instance of your
> > > DataSource factory.
> > > 
> > > 3. Add a context Resource element for your DataSource factory,
> > > remembering to use the factory element and specify the custom resource
> > > factory from 2.
> > > 
> > > HTH,
> > > 
> > > Mark
> > 
> > If external configuration were not required, would there be a problem
> > instantiating a DataSource directly and setting any required properties
> > programmatically?  Would any functionality be lost?
> The option of a global resource shared between multiple web apps is lost.
> 
> You'd need a mechanism (a statics would work) to store and retrieve the
> DataSource.
> 
> > Also, if there were base properties set in a <Resource> element, would
> > there be a problem using a copy of the properties from that data source,
> > modified as necessary, to instantiate a new DataSource?
> No, but you'd need to be careful since multiple requests for the same
> DataSource should return the same object. You'd need to be able to
> differentiate between a request for a new DataSourece and a previously
> created one.
> 
> Mark


Thanks!

-Terence


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic