Am 09.02.2011 15:02, schrieb Caldarale, Charles R:
From: Stephan Beutel [mailto:beu...@axivion.com]
Subject: Re: Context.xml for multiple datasources
But I thought it could be defined by a map in
context.xml like in Spring.
Even if you did, that wouldn't solve your problem.  You would still have to stop and 
restart the webapp every time an additional datasource was added to 
the<Context>  element.

You could provide a<Parameter>  element nested inside the<Context>  that specifies the 
names of the<Resource>  entries, but there's no automatically created list of<Resource>  
elements.

  - Chuck


THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY 
MATERIAL and is thus for use only by the intended recipient. If you received 
this in error, please contact the sender and delete the e-mail and its 
attachments from all computers.


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

Restarting the webapp is no problem. Rebuilding the war file is a problem.

At the moment I solved it in this was:

<Resource name="jdbc/first" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="sa" password="" driverClassName="org.sqlite.JDBC"
               url="jdbc:sqlite:C:\firstDatabase.db"/>

<Resource name="jdbc/second" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="sa" password="" driverClassName="org.sqlite.JDBC"
               url="jdbc:sqlite:C:\secondDatabase.db"/>

<Resource name="jdbc/third" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="sa" password="" driverClassName="org.sqlite.JDBC"
               url="jdbc:sqlite:C:\thirdDatabase.db"/>

<Environment name="dataSourceNames" value="first, second, third" type="java.lang.String"
                override="false"/>

<Environment name="dataSourceList" value="jdbc/first, jdbc/second, jdbc/third" type="java.lang.String"
                override="false"/>


Spring looks for the two environment vars (dataSourceNames, dataSourceList) and inject them into my RoutingDataSource class:

<jee:jndi-lookup id="dataSources" jndi-name="dataSourceList" />
<jee:jndi-lookup id="dataSourceNames" jndi-name="dataSourceNames" />

<bean id="dataSource" class="com.ax.dashboard.datasource.AxRoutingDataSource">

<property name="dataSources" ref="dataSources"/>
<property name="dataSourceNames" ref="dataSourceNames" />
</bean>

And in my java class I do the lookup with JNDI:

private void createDataSourceMap() {
if (this.dataSourceList != null && this.dataSourceNames != null && this.dataSourceList.size() > 0 && this.dataSourceNames.size() > 0 && dataSourceList.size() == this.dataSourceNames.size()) {
            this.dataSources = new HashMap<Object, Object>();
            for (int i = 0; i < dataSourceList.size(); i++) {
                Context initCtx;
                Object dataSource = null;
                try {
                    initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
                    dataSource = envCtx.lookup(dataSourceList.get(i));
                    if(i==0){
                        setDefaultTargetDataSource(dataSource);
                    }

                } catch (NamingException e) {
                    e.printStackTrace();
                }
                dataSources.put(dataSourceNames.get(i), dataSource);
            }
            setTargetDataSources(dataSources);
        }
    }

If someone has a better solution, please let me know.

Regards
Stephan

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

Reply via email to