Friday, April 20, 2012

"Lazy initialization" of jdbc connections from jndi datasource/connection pool: feasibility

I have a main controller servlet in which i instantiate a datasource. The servlet opens and closes the connections. Mainly, the servlet instantiates a command from the application using the "factory pattern". here is some code to explain:



public void init() throws ServletException {
super.init();
try {
datasource =(DataSource) getServletContext().getAttribute("DBCPool");
}
catch (Exception e) {

}
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//some code...
connection = getConnection();//where getConnection is a method: datasource.getconnection();
//now a command (a java class) is instantied, to which the CONNECTION obj is passed as parameter
cmdFactory.getInstance().getCommand(Cmd).execute(tsk,connection);

//Then wherever there is catch exception i close() the connection
// and it is always closed in finally
finally {
if(connection!=null)
connection.close()
}

}


Now , this works fine However now i got some new cases where some commands might not need to open a db connection because the data it is seeking for are cached in an identity map.



I tried to pass the "Connection" obj as a "null" parameter in the .execute(tsk,connection); and then in the corresponding java class to open a connection if needed



--> it did open the connection, however when process goes back to servlet : "Connection" is null as thus not closed.

What can i do to make the "Connection" obj's value get updated so that when back in servlet it is not "Null" anymore and i'd be able to close it?



I generally prefer to use a controller servlet that opens/close db connections, so what would be the best way to deal this kind of scenario where you have to do some sort of "lazy loading" a db connection from the pool and at the same time keep the opens/close of db connection assigned to the servlet?



Update (to explain further):




  • say i have a command : X.java

  • this command might/might not need a db connection (depends if the data searched for are in the identity map or not)



The system that i would like to have is:



(1)"client request"



(2)---> "Servlet": command.execute(connection)//where connection = null for now



(3) ---> "Command X": Do i need to go to database or record is in identity map?

(3.a) Case where it is needed to go to the database:

(3.a.1)connection = datasource.getconnection

(3.a.2) go get the data



(4)--->back to servlet: close "connection" in "Servlet"



Right now it is working until (3.a.2), but once back in (4) it appears that connection is still "null" and thus the code:



finally { 
if(connection!=null)
connection.close()
}


Does not work (doesn't close the connection) and thus the db pool get drained like that.
How could connection - which starts as "null" and changes inside command "X"- get "globaly" updated to the its new value, and not only "updated" inside the scope of command "X"?





No comments:

Post a Comment