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="..."/>
...
*
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="..."
/>
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]