Ik heb al flink wat info doorgespit, maar ik kom er niet echt achter.
De situatie: Voor een J2EE project waar ik aan werk gebruiken we als connection pool die van bitmechanic (com.bitmechanic.sql.ConnectionPoolManager). Deze implementeerd Driver, en ik laad deze in de init functie van een servlet die via load-on-startup in web.xml automatisch geladen wordt.
Opzich werkt dit en ik kan in de code later (bv in beans die vanuit JSPs worden aangeroepen) gewoon een connectie maken.
Als ik echter via DriverManager.getDrivers() alle drivers opvraag, dan krijg ik de connection pool niet terug. Via een debugger (eclipse) zie ik dat de connectionpool wel gewoon tussen de drivers staat in de private drivers vector van DriverManager, maar dat deze geskipped wordt (lang leve het in de source code kunnen kijken!
). Dit komt omdat de Class (met hoofdletter dus) van de Driver die de getDrivers functie dmv de huidige classloader laadt, niet overeenkomt met die van de opgeslagen Driver.
Na even verder kijken blijkt dus dat, de Servlet#init functie een andere classloader meekrijgt dan de Servlet#service functie waar mijn JSP naar gecompileerd wordt.
Waar het echte probleem komt kijken is als ik in een andere web application op dezelfde AS ook de connectionpool laad. Namelijk, om een DB connectie aan de pool toe te voegen moet je een alias opgeven. Als 2 web apps op dezelfde server dezelfde alias opgeven (maar verschillende DB connectie parameters), dan wordt de alias van de app die als 2de geladen wordt genegeerd en krijgt deze gewoon de DB van de eerste app.
Daarom wil ik dus die connectionpool via DriverManager.getDrivers opvragen, om te kijken of deze de opgeven alias al kent (ik kan dan een error geven). Door de classloader problematiek kan ik deze driver echter niet terug krijgen van DriverManager.
Weet iemand hoe ik toch bij die driver kan komen?
De situatie: Voor een J2EE project waar ik aan werk gebruiken we als connection pool die van bitmechanic (com.bitmechanic.sql.ConnectionPoolManager). Deze implementeerd Driver, en ik laad deze in de init functie van een servlet die via load-on-startup in web.xml automatisch geladen wordt.
Opzich werkt dit en ik kan in de code later (bv in beans die vanuit JSPs worden aangeroepen) gewoon een connectie maken.
Als ik echter via DriverManager.getDrivers() alle drivers opvraag, dan krijg ik de connection pool niet terug. Via een debugger (eclipse) zie ik dat de connectionpool wel gewoon tussen de drivers staat in de private drivers vector van DriverManager, maar dat deze geskipped wordt (lang leve het in de source code kunnen kijken!
Na even verder kijken blijkt dus dat, de Servlet#init functie een andere classloader meekrijgt dan de Servlet#service functie waar mijn JSP naar gecompileerd wordt.
Waar het echte probleem komt kijken is als ik in een andere web application op dezelfde AS ook de connectionpool laad. Namelijk, om een DB connectie aan de pool toe te voegen moet je een alias opgeven. Als 2 web apps op dezelfde server dezelfde alias opgeven (maar verschillende DB connectie parameters), dan wordt de alias van de app die als 2de geladen wordt genegeerd en krijgt deze gewoon de DB van de eerste app.
Daarom wil ik dus die connectionpool via DriverManager.getDrivers opvragen, om te kijken of deze de opgeven alias al kent (ik kan dan een error geven). Door de classloader problematiek kan ik deze driver echter niet terug krijgen van DriverManager.
Weet iemand hoe ik toch bij die driver kan komen?