Here's how I do it:
I defined a Database class with a constructor that takes a Datasource 
object.  It also has a static getSystemDatabase() method and a getConnection 
method.  I subclassed the struts ActionServlet and get ahold of its 
DataSource (defined in struts-config.xml) and pass it into my Database 
object.  Then anywhere in the system I can call 
Database.getSystemDatabase().getConnection() to get a connection to the 
database.

This also works outside of webapps because the Database class just knows 
about DataSources and not struts stuff.  Also, this lets your logic beans 
not know about servlets or struts which is much cleaner in my opinion.

Hope that helps,
Dave


>From: Steve McLeod <[EMAIL PROTECTED]>
>Reply-To: "Struts Users Mailing List" <[EMAIL PROTECTED]>
>To: "'[EMAIL PROTECTED]'" <[EMAIL PROTECTED]>
>Subject: Database Connection in Logic Beans - pooling?
>Date: Mon, 2 Sep 2002 10:09:47 +1000
>
>I am using:
>Tomcat 4.0
>Struts 1.0.2
>
>The problem
>========
>
>I have successfully used the Struts database connection pooling in a trial
>web app, but as far as I can tell, a reference to the datasource can only 
>be
>obtained from within an Action class (or directly within a JSP page but
>let's not think about that today).
>
>However I would like to have logic beans which handle database access,
>rather than have this in the Action class. But I can't get a reference to
>the datasource from the logic bean because it doesn't have a ServletContext
>to which I can get a handle.
>
>I have toyed with various ideas:
>- Initialise a logic bean by passing it a reference to the Servlet
>- Acquire a connection in the Action class and pass that to the bean
>
>But really, I would rather the logic bean know inherently how to acquire a
>database connection.
>
>My current workaround is to not use the Struts connection pooling, and
>rather to manually create a connection each time database access needs to 
>be
>done, then destroy it. But this is clearly not suitable for our production
>environment.
>
>
>The context of my problem
>==================
>
>I want to use some code like this in a JSP:
>
><jsp:useBean id="abean" scope="page"
>class="au.com.sunesis.timesheets.ClientManager" />
><table border="1">
>     <tr>
>         <th>#</th>
>         <th>Client</th>
>         <th>Active</th>
>     </tr>
><logic:iterate id="clientList" name="abean" property="clients"
>type="au.com.sunesis.timesheets.Client">
>     <tr>
>         <td><bean:write name="clientList" property="clientID"/></td>
>         <td><bean:write name="clientList" property="clientName"/></td>
>         <td><bean:write name="clientList" property="active"/></td>
>     </tr>
></logic:iterate>
>
>
>The idea is that ClientManager is used to handle all general database tasks
>for the Client bean (which maps to a Client entity in the database).
>ClientManager.getClients() connects to the database, creates an ArrayList 
>of
>Client objects, one for each row in the database, and returns the 
>ArrayList.
>
>ClientManager has other methods, such as:
>-         ClientManager.delete(Client c), which deletes the row in the
>database entity corresponding to the specified client.
>-         ClientManager.findByPrimaryKey(int ID) which returns the Client
>which matches the specified ID
>-         ClientManager.save(Client c), which stores the client in the
>database, creating or updating as necessary
>
>So an Action class can also call any of these directly, and it really
>shouldn't care about how these work and how they store to/retrieve from the
>database. But I can't think of the elegant way to do this and still be able
>to use the Struts connection pooling.
>
>Any thoughts?
>
>Thanks
>
>Steve McLeod
>
>
>




_________________________________________________________________
Send and receive Hotmail on your mobile device: http://mobile.msn.com


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to