You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Mi...@servicecanada.gc.ca on 2007/05/03 22:26:26 UTC

Appropriate place for transaction code?

Hi,

I'm new to Axis. I'm using Axis2 1.1.1.

I'm creating a service that retrieves data from a database. I'm using Hibernate. For those of you not familiar with it, the basic pattern of usage is that you create something called a SessionFactory once when the application starts, and then for each request/response cycle you create a Session. When the response finishes, you commit the session.

In regular web applications I create the session factory in the ApplicationContext. Then I make a servlet filter that creates the session and starts a transaction on the way in, and then commits the transaction and closes the session on the way out.

I'm trying to figure out how to do this in Axis. I created a module called hibernateTransactionModule. I've got two handlers, one for the way in and one for the way out, each attached to a new phase. Right now they're just saying 'hello world' and it works, they do execute when I expect them to.

So I've got three classes:

HibernateTransactionModule implements org.apache.axis2.modules.Module
HibernateTransactionHandlerBegin extends AbstractHandler implements Handler
HibernateTransactionHandlerEnd extends AbstractHandler implements Handler

My intuition tells me that HibernateTransactionModule.init() would be the appropriate place to create the hibernate session factory, HibernateTransactionHandlerBegin.invoke() could create a session for a request and put it into the messageContext, and HibernateTransactionHandlerEnd.invoke() could commit the transaction and close the session.

But I can't see a place where I can store the session factory where it can be accessible to the handlers.

One possibility would be to use a static field in HibernateTransactionHandlerBegin but that would be an ugly hack. Any suggestions?

Thanks
Michael Davis
www.damaru.com

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


RE: Appropriate place for transaction code?

Posted by Mi...@servicecanada.gc.ca.
Thanks, that does help!
 
Michael

-----Original Message-----
From: robert lazarski [mailto:robertlazarski@gmail.com]
Sent: Monday, May 07, 2007 9:44 AM
To: axis-user@ws.apache.org
Subject: Re: Appropriate place for transaction code?


Hi Michael, 

When doing hibernate transactions with web services, one way to do it is to have the transaction boundary inside a method that the web service calls. Spring does that automagically if you set it up right - but it certainly isn't mandatory to use Spring to do hibernate transactions in a web services. 

What you describe by your servlet filter seems to be what spring does in its Open Session In View pattern, so on the UI layer you could use the data after the session would normally terminate. In this case you probably just need a method that you call in a web service that opens and closes the session - managed by yourself or spring - since the data would presumably be in an OMElement or the chosen databinding, and not using attached hibernate objects. 

HTH,
Robert 


On 5/7/07, Michael.Davis@servicecanada.gc.ca <  <ma...@servicecanada.gc.ca> Michael.Davis@servicecanada.gc.ca> wrote: 

Thanks, that's helpful. I'll look into Spring. 

I will be adding operations that do inserts and updates soon.

Regards,
Michael

> -----Original Message-----
> From: Glen Mazza [mailto: grm7793@verizon.net  <ma...@verizon.net> ]
> Sent: Thursday, May 03, 2007 8:53 PM
> To: axis-user@ws.apache.org
> Subject: Re: Appropriate place for transaction code?
>
>
> Reading the third sentence of your email, you said the service is just 
> *retrieving* data from the database (i.e. SQL SELECT), is
> that correct?
> If so, commits would not be a concern for you--you may be able to keep
> your service in application scope[1] and just initialize an instance 
> variable to hold the session factory.
>
> Otherwise, I don't know if you're using Spring but the Axis2 Spring
> guide[2] may give you some ideas until someone else can get
> you a better 
> answer.
>
> [1] http://www.developer.com/java/web/article.php/10935_3620661_2
> [2] http://ws.apache.org/axis2/1_2/spring.html
>
> Glen
>
>
> Am Donnerstag, den 03.05.2007, 16:26 -0400 schrieb
> Michael.Davis@servicecanada.gc.ca  <ma...@servicecanada.gc.ca> :
> > Hi,
> >
> > I'm new to Axis. I'm using Axis2 1.1.1.
> >
> > I'm creating a service that retrieves data from a database.
> I'm using Hibernate. For those of you not familiar with it, 
> the basic pattern of usage is that you create something
> called a SessionFactory once when the application starts, and
> then for each request/response cycle you create a Session.
> When the response finishes, you commit the session. 
> >
> > In regular web applications I create the session factory in
> the ApplicationContext. Then I make a servlet filter that
> creates the session and starts a transaction on the way in,
> and then commits the transaction and closes the session on
> the way out.
> >
> > I'm trying to figure out how to do this in Axis. I created
> a module called hibernateTransactionModule. I've got two 
> handlers, one for the way in and one for the way out, each
> attached to a new phase. Right now they're just saying 'hello
> world' and it works, they do execute when I expect them to.
> >
> > So I've got three classes:
> >
> > HibernateTransactionModule implements
> org.apache.axis2.modules.Module
> > HibernateTransactionHandlerBegin extends AbstractHandler 
> implements Handler
> > HibernateTransactionHandlerEnd extends AbstractHandler
> implements Handler
> >
> > My intuition tells me that
> HibernateTransactionModule.init() would be the appropriate 
> place to create the hibernate session factory,
> HibernateTransactionHandlerBegin.invoke() could create a
> session for a request and put it into the messageContext, and
> HibernateTransactionHandlerEnd.invoke () could commit the
> transaction and close the session.
> >
> > But I can't see a place where I can store the session
> factory where it can be accessible to the handlers.
> >
> > One possibility would be to use a static field in
> HibernateTransactionHandlerBegin but that would be an ugly
> hack. Any suggestions?
> >
> > Thanks
> > Michael Davis
> > www.damaru.com
> >
> >
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: axis-user-help@ws.apache.org
> >
>
>
> --------------------------------------------------------------------- 
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org  <ma...@ws.apache.org> 
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org





Re: Appropriate place for transaction code?

Posted by robert lazarski <ro...@gmail.com>.
Hi Michael,

When doing hibernate transactions with web services, one way to do it is to
have the transaction boundary inside a method that the web service calls.
Spring does that automagically if you set it up right - but it certainly
isn't mandatory to use Spring to do hibernate transactions in a web
services.

What you describe by your servlet filter seems to be what spring does in its
Open Session In View pattern, so on the UI layer you could use the data
after the session would normally terminate. In this case you probably just
need a method that you call in a web service that opens and closes the
session - managed by yourself or spring - since the data would presumably be
in an OMElement or the chosen databinding, and not using attached hibernate
objects.

HTH,
Robert

On 5/7/07, Michael.Davis@servicecanada.gc.ca <
Michael.Davis@servicecanada.gc.ca> wrote:
>
> Thanks, that's helpful. I'll look into Spring.
>
> I will be adding operations that do inserts and updates soon.
>
> Regards,
> Michael
>
> > -----Original Message-----
> > From: Glen Mazza [mailto:grm7793@verizon.net]
> > Sent: Thursday, May 03, 2007 8:53 PM
> > To: axis-user@ws.apache.org
> > Subject: Re: Appropriate place for transaction code?
> >
> >
> > Reading the third sentence of your email, you said the service is just
> > *retrieving* data from the database (i.e. SQL SELECT), is
> > that correct?
> > If so, commits would not be a concern for you--you may be able to keep
> > your service in application scope[1] and just initialize an instance
> > variable to hold the session factory.
> >
> > Otherwise, I don't know if you're using Spring but the Axis2 Spring
> > guide[2] may give you some ideas until someone else can get
> > you a better
> > answer.
> >
> > [1] http://www.developer.com/java/web/article.php/10935_3620661_2
> > [2] http://ws.apache.org/axis2/1_2/spring.html
> >
> > Glen
> >
> >
> > Am Donnerstag, den 03.05.2007, 16:26 -0400 schrieb
> > Michael.Davis@servicecanada.gc.ca:
> > > Hi,
> > >
> > > I'm new to Axis. I'm using Axis2 1.1.1.
> > >
> > > I'm creating a service that retrieves data from a database.
> > I'm using Hibernate. For those of you not familiar with it,
> > the basic pattern of usage is that you create something
> > called a SessionFactory once when the application starts, and
> > then for each request/response cycle you create a Session.
> > When the response finishes, you commit the session.
> > >
> > > In regular web applications I create the session factory in
> > the ApplicationContext. Then I make a servlet filter that
> > creates the session and starts a transaction on the way in,
> > and then commits the transaction and closes the session on
> > the way out.
> > >
> > > I'm trying to figure out how to do this in Axis. I created
> > a module called hibernateTransactionModule. I've got two
> > handlers, one for the way in and one for the way out, each
> > attached to a new phase. Right now they're just saying 'hello
> > world' and it works, they do execute when I expect them to.
> > >
> > > So I've got three classes:
> > >
> > > HibernateTransactionModule implements
> > org.apache.axis2.modules.Module
> > > HibernateTransactionHandlerBegin extends AbstractHandler
> > implements Handler
> > > HibernateTransactionHandlerEnd extends AbstractHandler
> > implements Handler
> > >
> > > My intuition tells me that
> > HibernateTransactionModule.init() would be the appropriate
> > place to create the hibernate session factory,
> > HibernateTransactionHandlerBegin.invoke() could create a
> > session for a request and put it into the messageContext, and
> > HibernateTransactionHandlerEnd.invoke() could commit the
> > transaction and close the session.
> > >
> > > But I can't see a place where I can store the session
> > factory where it can be accessible to the handlers.
> > >
> > > One possibility would be to use a static field in
> > HibernateTransactionHandlerBegin but that would be an ugly
> > hack. Any suggestions?
> > >
> > > Thanks
> > > Michael Davis
> > > www.damaru.com
> > >
> > >
> > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > > For additional commands, e-mail: axis-user-help@ws.apache.org
> > >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: axis-user-help@ws.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
>
>

RE: Appropriate place for transaction code?

Posted by Mi...@servicecanada.gc.ca.
Thanks, that's helpful. I'll look into Spring.

I will be adding operations that do inserts and updates soon.

Regards,
Michael

> -----Original Message-----
> From: Glen Mazza [mailto:grm7793@verizon.net]
> Sent: Thursday, May 03, 2007 8:53 PM
> To: axis-user@ws.apache.org
> Subject: Re: Appropriate place for transaction code?
> 
> 
> Reading the third sentence of your email, you said the service is just
> *retrieving* data from the database (i.e. SQL SELECT), is 
> that correct?
> If so, commits would not be a concern for you--you may be able to keep
> your service in application scope[1] and just initialize an instance
> variable to hold the session factory.
> 
> Otherwise, I don't know if you're using Spring but the Axis2 Spring
> guide[2] may give you some ideas until someone else can get 
> you a better
> answer.
> 
> [1] http://www.developer.com/java/web/article.php/10935_3620661_2
> [2] http://ws.apache.org/axis2/1_2/spring.html
> 
> Glen
> 
> 
> Am Donnerstag, den 03.05.2007, 16:26 -0400 schrieb
> Michael.Davis@servicecanada.gc.ca:
> > Hi,
> > 
> > I'm new to Axis. I'm using Axis2 1.1.1.
> > 
> > I'm creating a service that retrieves data from a database. 
> I'm using Hibernate. For those of you not familiar with it, 
> the basic pattern of usage is that you create something 
> called a SessionFactory once when the application starts, and 
> then for each request/response cycle you create a Session. 
> When the response finishes, you commit the session.
> > 
> > In regular web applications I create the session factory in 
> the ApplicationContext. Then I make a servlet filter that 
> creates the session and starts a transaction on the way in, 
> and then commits the transaction and closes the session on 
> the way out.
> > 
> > I'm trying to figure out how to do this in Axis. I created 
> a module called hibernateTransactionModule. I've got two 
> handlers, one for the way in and one for the way out, each 
> attached to a new phase. Right now they're just saying 'hello 
> world' and it works, they do execute when I expect them to.
> > 
> > So I've got three classes:
> > 
> > HibernateTransactionModule implements 
> org.apache.axis2.modules.Module
> > HibernateTransactionHandlerBegin extends AbstractHandler 
> implements Handler
> > HibernateTransactionHandlerEnd extends AbstractHandler 
> implements Handler
> > 
> > My intuition tells me that 
> HibernateTransactionModule.init() would be the appropriate 
> place to create the hibernate session factory, 
> HibernateTransactionHandlerBegin.invoke() could create a 
> session for a request and put it into the messageContext, and 
> HibernateTransactionHandlerEnd.invoke() could commit the 
> transaction and close the session.
> > 
> > But I can't see a place where I can store the session 
> factory where it can be accessible to the handlers.
> > 
> > One possibility would be to use a static field in 
> HibernateTransactionHandlerBegin but that would be an ugly 
> hack. Any suggestions?
> > 
> > Thanks
> > Michael Davis
> > www.damaru.com
> > 
> > 
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> > For additional commands, e-mail: axis-user-help@ws.apache.org
> > 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org


Re: Appropriate place for transaction code?

Posted by Glen Mazza <gr...@verizon.net>.
Reading the third sentence of your email, you said the service is just
*retrieving* data from the database (i.e. SQL SELECT), is that correct?
If so, commits would not be a concern for you--you may be able to keep
your service in application scope[1] and just initialize an instance
variable to hold the session factory.

Otherwise, I don't know if you're using Spring but the Axis2 Spring
guide[2] may give you some ideas until someone else can get you a better
answer.

[1] http://www.developer.com/java/web/article.php/10935_3620661_2
[2] http://ws.apache.org/axis2/1_2/spring.html

Glen


Am Donnerstag, den 03.05.2007, 16:26 -0400 schrieb
Michael.Davis@servicecanada.gc.ca:
> Hi,
> 
> I'm new to Axis. I'm using Axis2 1.1.1.
> 
> I'm creating a service that retrieves data from a database. I'm using Hibernate. For those of you not familiar with it, the basic pattern of usage is that you create something called a SessionFactory once when the application starts, and then for each request/response cycle you create a Session. When the response finishes, you commit the session.
> 
> In regular web applications I create the session factory in the ApplicationContext. Then I make a servlet filter that creates the session and starts a transaction on the way in, and then commits the transaction and closes the session on the way out.
> 
> I'm trying to figure out how to do this in Axis. I created a module called hibernateTransactionModule. I've got two handlers, one for the way in and one for the way out, each attached to a new phase. Right now they're just saying 'hello world' and it works, they do execute when I expect them to.
> 
> So I've got three classes:
> 
> HibernateTransactionModule implements org.apache.axis2.modules.Module
> HibernateTransactionHandlerBegin extends AbstractHandler implements Handler
> HibernateTransactionHandlerEnd extends AbstractHandler implements Handler
> 
> My intuition tells me that HibernateTransactionModule.init() would be the appropriate place to create the hibernate session factory, HibernateTransactionHandlerBegin.invoke() could create a session for a request and put it into the messageContext, and HibernateTransactionHandlerEnd.invoke() could commit the transaction and close the session.
> 
> But I can't see a place where I can store the session factory where it can be accessible to the handlers.
> 
> One possibility would be to use a static field in HibernateTransactionHandlerBegin but that would be an ugly hack. Any suggestions?
> 
> Thanks
> Michael Davis
> www.damaru.com
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-help@ws.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org