You would simply use the Fully Qualified class name and make sure it
implements DataSourceFactory.

<transactionManager ...>
<dataSource type="com.foo.MyCustomerFactory">
<property name="propertyA" value="valueA"/>
<property name="propertyB" value="valueB"/>
</dataSource>
</transactionManager>

Where you set the company is up to your architecture. Where do you get
the id from in the first place?

Brandon

On 4/21/05, Rafiq, Adnan <[EMAIL PROTECTED]> wrote:
>  
> Larry, 
>   
> Using ThreadLocal just might solve my problem. This is what I am thinking: 
>   
> 1 - Extend the JndiDataSourceFactory class and override the getDataSource
> method 
> 2 - Obtain the company id from ThreadLocal (assuming that its been set in
> the DaoImpl class) 
> 3 - In the getDataSource method of my new factory class, lookup the
> datasource name based on the company id 
> 4 - Return the looked-up datasource name (instead of the one defined in sql
> maps xml file) 
>   
> However, I need to figure out the following: 
> 1 - If extend the JndiDataSourceFactory class, how do I plug it into iBatis?
> 2 - What will be the best place to set the company id in ThreadLocal 
>     a) In the DaoImpl class constructor, or 
>     b) In each DaoImpl class method 
>   
> Your help is really appreciated in this matter. 
>   
> Thanks, 
>   
> - Adnan 
>  
> -----Original Message-----
> From: Larry Meadors [mailto:[EMAIL PROTECTED]
> Sent: Thursday, April 21, 2005 11:15 AM
> To: ibatis-user-java@incubator.apache.org
> Subject: Re: Dynamically Discovering DataSource
> 
> This is such an unusual case that IMO, the DataSourceFactory should not be
> changed to accommodate it.
> 
> You could probably use a ThreadLocal class to set the parameter, then in
> your datasource, examine it to decide the real datasource to use.
> 
> Larry
> 
>  
> On 4/21/05, Rafiq, Adnan <[EMAIL PROTECTED]> wrote: 
> > 
> > Larry, 
> >   
> > Thanks for the suggestion. 
> >   
> > I looked at the DataSourceFactory. The method getDataSource() does not
> take any parameters. The flow of our application is like this: 
> >   
> > 1 - Contact the system datasource and get a list of all companies and
> their associated datasource jndi names 
> > 2 - When the user logs in, we get its company id and using it as a key we
> find the corresponding datasource jndi name 
> > 3 - The company datasource jndi name is then returned and used for all
> connections. 
> >   
> > What seems like a good solution is to extend the JNDIDataSourceFactory and
> overload the method getDataSource so that it can accept a company id as an
> argument: getDataSource(int companyId). Internally, we have a map of
> companyid (key) and datasource name (value). 
> >   
> > However, what I can't figure out is where that method is actually called
> in iBatis. 
> >   
> > Thanks, 
> >   
> > - Adnan 
> > 
> > 
> > -----Original Message-----
> > From: Larry Meadors [mailto:[EMAIL PROTECTED]
> > Sent: Thursday, April 21, 2005 10:26 AM
> > To: ibatis-user-java@incubator.apache.org
> > Subject: Re: Dynamically Discovering DataSource
> > 
> > Roll your own javax.sql.DataSource (6 methods) and
> com.ibatis.sqlmap.engine.datasource.DataSourceFactory (2
> methods).
> > 
> > Larry
> > 
> > 
> > On 4/21/05, Rafiq, Adnan <[EMAIL PROTECTED]> wrote: 
> > > 
> > > I have a situation where we have an ASP-like environment. There is one
> system database and several customer-specific databases. Each customer
> database is mapped to a different datasource. In iBatis we have to hardcode
> the JNDI name for the datasource in the sql-map-confi.xml file. Is there
> anyway to make this dynamic? In other words, I want to query the customer
> datasource name (the names are stored in the system database) at run time
> based on the user id, and then use that name for getting my connections. 
> > >   
> > > Any help is greatly appreciated.
> > 
> > 
> 
>

Reply via email to