You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cassandra.apache.org by Ralph Soika <ra...@imixs.com> on 2019/06/11 21:38:16 UTC

Cassandra DataStax Java Driver in combination with Java EE / EJBs

Hi,

I have a question concerning the Cassandra DataStax Java Driver in 
combination with Java EE and EJBs.

I have implemented a Rest Service API based on Java EE8. In my 
application I have for example a jax-rs rest resource to write data into 
cassandra cluster. My first approach was to create in each method call

 1.   a new Casssandra Cluster and Session object,
 2.   write my data into cassandra
 3.   and finally close the session and the cluster object.

This works but it takes a lot of time (2-3 seconds) until the cluster 
object / session is opened for each request.

  So my second approach is now a @Singleton EJB providing the session 
object for my jax-rs resources. My service implementation to hold the 
Session object looks something like this:


*@Singleton*
*public class* ClusterService {
     private Cluster cluster;
     private Session session;

     @PostConstruct
*private void* init() throws ArchiveException {
         cluster=initCluster();
         session = initArchiveSession();
     }

     @PreDestroy
*private* void tearDown() throws ArchiveException {
         // close session and cluster object
         if (session != null) {
             session.close();
         }
         if (cluster != null) {
             cluster.close();
         }
     }

*public* Session getSession() {
         if (session==null) {
             try {
                 init();
             } catch (ArchiveException e) {
                 logger.warning("unable to get falid session: " + 
e.getMessage());
                 e.printStackTrace();
             }
         }
*return* session;
     }

    .....

}


And my rest service calls now looking like this:


@Path("/archive")
@Stateless
*public class* ArchiveRestService {

     @EJB
     ClusterService clusterService;

     @POST
     @Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML })
*public* Response postData(XMLDocument xmlDocument) {
         Session session = clusterService.getSession();
         session.execute(....);
         ...
     }
     ...
}


The result is now a super-fast behavior!Seems to be clear because my 
rest service no longer need to open a new session for each request.

My question is: Is this approach with a @Singleton ClusterService EJB 
valid or is there something I should avoid?
As far as I can see this works pretty fine and is really fast. I am 
running the application on a Wildfly 15 server which is Java EE8.

Thanks for your comments

Ralph




-- 

*Imixs Software Solutions GmbH*
*Web:* www.imixs.com <http://www.imixs.com> *Phone:* +49 (0)89-452136 16
*Office:* Agnes-Pockels-Bogen 1, 80992 München
Registergericht: Amtsgericht Muenchen, HRB 136045
Geschaeftsführer: Gaby Heinle u. Ralph Soika

*Imixs* is an open source company, read more: www.imixs.org 
<http://www.imixs.org>


Re: Cassandra DataStax Java Driver in combination with Java EE / EJBs

Posted by Ralph Soika <ra...@imixs.com>.
Hi Stefan,
Hi John,

thanks for your answers, this helps me a lot.

@John: you are right, EJB does not bring any advantage in this case. I 
will change my classes to simple CDI.

I will write a short blog about this solution after I finished.

Best regards

Ralph

On 12.06.19 07:58, Stefan Miklosovic wrote:
> Hi Ralph,
>
> yes this is completely fine, even advisable. You can further extend
> this idea to have sessions per keyspace for example if you really
> insist, and it could be injectable based on some qualifier ... thats
> up to you.
>
> On Wed, 12 Jun 2019 at 11:31, John Sanda <jo...@gmail.com> wrote:
>> Hi Ralph,
>>
>> A session is intended to be a long-lived, i.e., application-scoped object. You only need one session per cluster. I think what you are doing with the @Singleton is fine. In my opinion though, EJB really does not offer much value when working with Cassandra. I would be inclined to just use CDI.
>>
>> Cheers
>>
>> John
>>
>> On Tue, Jun 11, 2019 at 5:38 PM Ralph Soika <ra...@imixs.com> wrote:
>>> Hi,
>>>
>>> I have a question concerning the Cassandra DataStax Java Driver in combination with Java EE and EJBs.
>>>
>>> I have implemented a Rest Service API based on Java EE8. In my application I have for example a jax-rs rest resource to write data into cassandra cluster. My first approach was to create in each method call
>>>
>>>   a new Casssandra Cluster and Session object,
>>>   write my data into cassandra
>>>   and finally close the session and the cluster object.
>>>
>>> This works but it takes a lot of time (2-3 seconds) until the cluster object / session is opened for each request.
>>>
>>>   So my second approach is now a @Singleton EJB providing the session object for my jax-rs resources. My service implementation to hold the Session object looks something like this:
>>>
>>>
>>> @Singleton
>>> public class ClusterService {
>>>      private Cluster cluster;
>>>      private Session session;
>>>
>>>      @PostConstruct
>>>      private void init() throws ArchiveException {
>>>          cluster=initCluster();
>>>          session = initArchiveSession();
>>>      }
>>>
>>>      @PreDestroy
>>>      private void tearDown() throws ArchiveException {
>>>          // close session and cluster object
>>>          if (session != null) {
>>>              session.close();
>>>          }
>>>          if (cluster != null) {
>>>              cluster.close();
>>>          }
>>>      }
>>>
>>>      public Session getSession() {
>>>          if (session==null) {
>>>              try {
>>>                  init();
>>>              } catch (ArchiveException e) {
>>>                  logger.warning("unable to get falid session: " + e.getMessage());
>>>                  e.printStackTrace();
>>>              }
>>>          }
>>>          return session;
>>>      }
>>>
>>>     .....
>>>
>>> }
>>>
>>>
>>> And my rest service calls now looking like this:
>>>
>>>
>>> @Path("/archive")
>>> @Stateless
>>> public class ArchiveRestService {
>>>
>>>      @EJB
>>>      ClusterService clusterService;
>>>
>>>      @POST
>>>      @Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML })
>>>      public Response postData(XMLDocument xmlDocument) {
>>>          Session session = clusterService.getSession();
>>>          session.execute(....);
>>>          ...
>>>      }
>>>      ...
>>> }
>>>
>>>
>>> The result is now a super-fast behavior! Seems to be clear because my rest service no longer need to open a new session for each request.
>>>
>>> My question is: Is this approach with a @Singleton ClusterService EJB valid or is there something I should avoid?
>>> As far as I can see this works pretty fine and is really fast. I am running the application on a Wildfly 15 server which is Java EE8.
>>>
>>> Thanks for your comments
>>>
>>> Ralph
>>>
>>>
>>>
>>>
>>> --
>>>
>>> Imixs Software Solutions GmbH
>>> Web: www.imixs.com Phone: +49 (0)89-452136 16
>>> Office: Agnes-Pockels-Bogen 1, 80992 München
>>> Registergericht: Amtsgericht Muenchen, HRB 136045
>>> Geschaeftsführer: Gaby Heinle u. Ralph Soika
>>>
>>> Imixs is an open source company, read more: www.imixs.org
>>
>>
>> --
>>
>> - John
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@cassandra.apache.org
> For additional commands, e-mail: user-help@cassandra.apache.org
>
-- 

*Imixs Software Solutions GmbH*
*Web:* www.imixs.com <http://www.imixs.com> *Phone:* +49 (0)89-452136 16
*Office:* Agnes-Pockels-Bogen 1, 80992 München
Registergericht: Amtsgericht Muenchen, HRB 136045
Geschaeftsführer: Gaby Heinle u. Ralph Soika

*Imixs* is an open source company, read more: www.imixs.org 
<http://www.imixs.org>


Re: Cassandra DataStax Java Driver in combination with Java EE / EJBs

Posted by Stefan Miklosovic <st...@instaclustr.com>.
Hi Ralph,

yes this is completely fine, even advisable. You can further extend
this idea to have sessions per keyspace for example if you really
insist, and it could be injectable based on some qualifier ... thats
up to you.

On Wed, 12 Jun 2019 at 11:31, John Sanda <jo...@gmail.com> wrote:
>
> Hi Ralph,
>
> A session is intended to be a long-lived, i.e., application-scoped object. You only need one session per cluster. I think what you are doing with the @Singleton is fine. In my opinion though, EJB really does not offer much value when working with Cassandra. I would be inclined to just use CDI.
>
> Cheers
>
> John
>
> On Tue, Jun 11, 2019 at 5:38 PM Ralph Soika <ra...@imixs.com> wrote:
>>
>> Hi,
>>
>> I have a question concerning the Cassandra DataStax Java Driver in combination with Java EE and EJBs.
>>
>> I have implemented a Rest Service API based on Java EE8. In my application I have for example a jax-rs rest resource to write data into cassandra cluster. My first approach was to create in each method call
>>
>>  a new Casssandra Cluster and Session object,
>>  write my data into cassandra
>>  and finally close the session and the cluster object.
>>
>> This works but it takes a lot of time (2-3 seconds) until the cluster object / session is opened for each request.
>>
>>  So my second approach is now a @Singleton EJB providing the session object for my jax-rs resources. My service implementation to hold the Session object looks something like this:
>>
>>
>> @Singleton
>> public class ClusterService {
>>     private Cluster cluster;
>>     private Session session;
>>
>>     @PostConstruct
>>     private void init() throws ArchiveException {
>>         cluster=initCluster();
>>         session = initArchiveSession();
>>     }
>>
>>     @PreDestroy
>>     private void tearDown() throws ArchiveException {
>>         // close session and cluster object
>>         if (session != null) {
>>             session.close();
>>         }
>>         if (cluster != null) {
>>             cluster.close();
>>         }
>>     }
>>
>>     public Session getSession() {
>>         if (session==null) {
>>             try {
>>                 init();
>>             } catch (ArchiveException e) {
>>                 logger.warning("unable to get falid session: " + e.getMessage());
>>                 e.printStackTrace();
>>             }
>>         }
>>         return session;
>>     }
>>
>>    .....
>>
>> }
>>
>>
>> And my rest service calls now looking like this:
>>
>>
>> @Path("/archive")
>> @Stateless
>> public class ArchiveRestService {
>>
>>     @EJB
>>     ClusterService clusterService;
>>
>>     @POST
>>     @Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML })
>>     public Response postData(XMLDocument xmlDocument) {
>>         Session session = clusterService.getSession();
>>         session.execute(....);
>>         ...
>>     }
>>     ...
>> }
>>
>>
>> The result is now a super-fast behavior! Seems to be clear because my rest service no longer need to open a new session for each request.
>>
>> My question is: Is this approach with a @Singleton ClusterService EJB valid or is there something I should avoid?
>> As far as I can see this works pretty fine and is really fast. I am running the application on a Wildfly 15 server which is Java EE8.
>>
>> Thanks for your comments
>>
>> Ralph
>>
>>
>>
>>
>> --
>>
>> Imixs Software Solutions GmbH
>> Web: www.imixs.com Phone: +49 (0)89-452136 16
>> Office: Agnes-Pockels-Bogen 1, 80992 München
>> Registergericht: Amtsgericht Muenchen, HRB 136045
>> Geschaeftsführer: Gaby Heinle u. Ralph Soika
>>
>> Imixs is an open source company, read more: www.imixs.org
>
>
>
> --
>
> - John

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


Re: Cassandra DataStax Java Driver in combination with Java EE / EJBs

Posted by John Sanda <jo...@gmail.com>.
Hi Ralph,

A session is intended to be a long-lived, i.e., application-scoped object.
You only need one session per cluster. I think what you are doing with
the @Singleton is fine. In my opinion though, EJB really does not offer
much value when working with Cassandra. I would be inclined to just use CDI.

Cheers

John

On Tue, Jun 11, 2019 at 5:38 PM Ralph Soika <ra...@imixs.com> wrote:

> Hi,
>
> I have a question concerning the Cassandra DataStax Java Driver in
> combination with Java EE and EJBs.
>
> I have implemented a Rest Service API based on Java EE8. In my application
> I have for example a jax-rs rest resource to write data into cassandra
> cluster. My first approach was to create in each method call
>
>    1.  a new Casssandra Cluster and Session object,
>    2.  write my data into cassandra
>    3.  and finally close the session and the cluster object.
>
> This works but it takes a lot of time (2-3 seconds) until the cluster
> object / session is opened for each request.
>
>  So my second approach is now a @Singleton EJB providing the session
> object for my jax-rs resources. My service implementation to hold the
> Session object looks something like this:
>
>
> *@Singleton*
> *public class* ClusterService {
>     private Cluster cluster;
>     private Session session;
>
>     @PostConstruct
>     *private void* init() throws ArchiveException {
>         cluster=initCluster();
>         session = initArchiveSession();
>     }
>
>     @PreDestroy
>     *private* void tearDown() throws ArchiveException {
>         // close session and cluster object
>         if (session != null) {
>             session.close();
>         }
>         if (cluster != null) {
>             cluster.close();
>         }
>     }
>
>     *public* Session getSession() {
>         if (session==null) {
>             try {
>                 init();
>             } catch (ArchiveException e) {
>                 logger.warning("unable to get falid session: " +
> e.getMessage());
>                 e.printStackTrace();
>             }
>         }
>         *return* session;
>     }
>
>    .....
>
> }
>
>
> And my rest service calls now looking like this:
>
>
> @Path("/archive")
> @Stateless
> *public class* ArchiveRestService {
>
>     @EJB
>     ClusterService clusterService;
>
>     @POST
>     @Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML })
>     *public* Response postData(XMLDocument xmlDocument) {
>         Session session = clusterService.getSession();
>         session.execute(....);
>         ...
>     }
>     ...
> }
>
>
> The result is now a super-fast behavior! Seems to be clear because my
> rest service no longer need to open a new session for each request.
>
> My question is: Is this approach with a @Singleton ClusterService EJB
> valid or is there something I should avoid?
> As far as I can see this works pretty fine and is really fast. I am
> running the application on a Wildfly 15 server which is Java EE8.
>
> Thanks for your comments
>
> Ralph
>
>
>
>
> --
>
> *Imixs Software Solutions GmbH*
> *Web:* www.imixs.com *Phone:* +49 (0)89-452136 16
> *Office:* Agnes-Pockels-Bogen 1, 80992 München
> Registergericht: Amtsgericht Muenchen, HRB 136045
> Geschaeftsführer: Gaby Heinle u. Ralph Soika
>
> *Imixs* is an open source company, read more: www.imixs.org
>


-- 

- John