That solved the problem. I thought that I had ran into a problem where tomcat
couldn't find the classorg.apache.naming.factory.DataSourceLinkFactory before
but it must have been something else.
________________________________
De: Mark Thomas <[email protected]>
Enviado: quinta-feira, 29 de agosto de 2024 13:48
Para: [email protected] <[email protected]>
Assunto: Re: Understanding ResorceLink property inheritance
On 29/08/2024 15:52, Marcelo de Sena Lacerda wrote:
> The resource definition in server.xml
>
> ...
> <GlobalNamingResources>
> ...
> <Resource name="jdbc/mydatabase"
> global="jdbc/mydatabase"
> auth="Container"
> type="javax.sql.DataSource"
> removeAbandoned="true"
> removeAbandonedTimeout="120"
> maxActive="5"
> maxIdle="5"
> initialSize="0"
> minIdle="0"
> maxWait="200"
> timeBetweenEvictionRunsMillis="30000"
> minEvictableIdleTimeMillis="60000"
> maxAge="120000"
> validatorClassName="..."
> testOnBorrow="true"
> validationInterval="0"
> fairQueue="false"
> factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
> alternateUsernameAllowed="true"
> username="..." password="..."
> driverClassName="..."
> url="..."/>
OK. The global resource looks good.
> ...
>
>
> *
> Wrong factory.
> *
> driverClassName is not a valid attribute for a ResourceLink
> *
> url is not a valid attribute for a ResourceLink
>
> From reading the documentation that was also my initial thought, however if
> I write my ResourceLink like this:
>
>
> <ResourceLink
> name="jdbc/mydatabase"
> global="jdbc/mydatabase"
> type="javax.sql.DataSource"
> factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
> username="..."
> password="..."
>
> />
The factory should be org.apache.naming.factory.DataSourceLinkFactory in
the ResoucreLink. Otherwise the above looks OK to me.
(Note: I'm basing this off reading the documentation - I haven't tested
that it actually works).
Mark
>
> I get the following error:
>
> javax.naming.NamingException: Unexpected exception resolving reference [Root
> exception is java.sql.SQLException: The url cannot be null
>
> When my code tries to obtain the DataSource from the context:
>
> DataSource ds = (DataSource)envContext.lookup("jdbc/mydatabase");
> ________________________________
> De: Mark Thomas <[email protected]>
> Enviado: quinta-feira, 29 de agosto de 2024 10:30
> Para: [email protected] <[email protected]>
> Assunto: Re: Understanding ResorceLink property inheritance
>
> On 29/08/2024 14:19, Marcelo de Sena Lacerda wrote:
>> Understanding ResorceLink property inheritance
>>
>> My scenario is this, I have several applications running on a tomcat, all of
>> them access the same database I want them to be inside the same pool so the
>> number of connections oppened can be sensibly managed using the same
>> parameters. All of that works as of now.
>>
>> Additionally I also want them to connect to the database using different
>> users so that's easier to identify which application is running which
>> processes in the database.
>>
>> My understanding is that I could do that with setting a Resource in my
>> server.xml with all the pool configuration parameters set and a ResourceLink
>> in the context.xml of the application with only the username and password
>> set.
>
> Yes, but only under specific circumstances.
>
> https://tomcat.apache.org/tomcat-11.0-doc/config/context.html#Resource_Links
>
>> That more or less works. Indeed if setup the scenario described in the above
>> paragraph I can set a different username and password for the Resource in
>> the ResourceLink, however it seems that tomcat "forgets" every other
>> parameter of the Resource driverClass,url, and, more importantly maxActive,
>> maxIdle, initialSize all gets "forgotten" by tomcat.
>>
>> Why is that happening?
>
> We need to see the resource definition in server.xml as there may be
> changes required there as well.
>
>> I'm using tomcat 10.1.28 with java 22.0.2 from openjdk.
>>
>> This is the ResourceLink that inherits all parameters from server.xml:
>>
>> <ResourceLink
>> name="jdbc/mydatabase"
>> global="jdbc/mydatabase"
>> type="javax.sql.DataSource"
>> />
>>
>> And this is one that forgets all parent parameters:
>>
>> <ResourceLink
>> name="jdbc/mydatabase"
>> global="jdbc/mydatabase"
>> type="javax.sql.DataSource"
>> driverClassName="..."
>> url="..."
>> username="..."
>> password="..."
>> factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
>> />
>
> Wrong factory.
> driverClassName is not a valid attribute for a ResourceLink
> url is not a valid attribute for a ResourceLink
>
> Mark
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]