Yes, I got it! I' m just re-writing the code in that manner exactly.
Thank you very much for your attention :))
----- Original Message -----
From: "Craig R. McClanahan" <[EMAIL PROTECTED]>
To: "Struts Users Mailing List" <[EMAIL PROTECTED]>
Sent: Thursday, March 04, 2004 9:02 PM
Subject: Re: ConcurrentModificationException
|
| Quoting "Sergei P. Volin" <[EMAIL PROTECTED]>:
|
| >
| > Greetings,
| >
| > That is the question! Today morning I've found the reason of my
troubles. It
| > was my negligence in how I assigned a value to the iterated list that I
| > placed in the object which I then stored in a session for JSP's
iterator. I
| > declared the list in my action as a global variable, assigned a value to
it
| > in the protected void method which is called by the action execute
method
| > like this:
| >
| > public class MyAction extends Action {
| > protected ArrayList list = new ArrayList();
| > ...
| > public ActionForward execute(...) ... {
| > list = new ArrayList();
| > myMethod(...);
| > obj.setList(list)
| > session.setAttribute("buinessObj", obj);
| > ...
| > return mapping.findForward(forward);
| > }
| > protected void myMethod(...) {
| > ...
| > while (rs.next()) {
| > ...
| > list.add(el);
| > ...
| > }
| > }
| > }
| >
| > Now this piece of code looks like:
| >
| > public class MyAction extends Action {
| > protected ArrayList list = new ArrayList();
| > ...
| > public ActionForward execute(...) ... {
| > list = new ArrayList();
| > myMethod(...);
| > obj.setList(list)
| > session.setAttribute("buinessObj", obj);
| > ...
| > return mapping.findForward(forward);
| > }
| > protected void myMethod(...) {
| > ArrayList list = new ArrayList(); // new
| > ...
| > while (rs.next()) {
| > ...
| > list.add(el);
| > ...
| > }
| > this.list =list; // new
| > }
| > }
| >
| > It looks that with this code I rid off all my troubles now - no
| > ConcurrentModificationException, no doubling of list size. I made a
dozen of
| > tests - no exceptions and the results were correct.
| >
| > Mr. Craig R. McClanahan! Am I right now with my code? Please, reply.
| > Thanks a lot,
|
| No, you are still going to have a problem with the shared instance
variable when
| two requests occur at the same time. A general principle you should
follow is
| to *never* use instance variables in an Action (or a servlet, for that
matter)
| to store anything that relates only to the current request. It's fine to
use
| instance variables to share things that are common to all requests,
though.
|
| An easy way to do this in your scenario would be something like this:
|
| public class MyAction extends Action {
| // protected ArrayList list = new ArrayList(); (COMMENTED OUT)
| ...
| public ActionForward execute(...) ... {
| List list = myMethod(); // NEWER
| // myMethod(...); (COMMENTED OUT)
| obj.setList(list)
| session.setAttribute("buinessObj", obj);
| ...
| return mapping.findForward(forward);
| }
| // protected void myMethod(...) { (COMMENTED OUT)
| protected List myMethod(...) { // NEWER
| ArrayList list = new ArrayList(); // new
| ...
| while (rs.next()) {
| ...
| list.add(el);
| ...
| }
| // this.list =list; // new (COMMENTED OUT)
| return list;
| }
| }
|
|
| Craig
|
|
| ---------------------------------------------------------------------
| 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]