Interfacing with Database on Server

vimana jsaund2000 at rogers.com
Fri Oct 23 17:16:25 EDT 2009


Thank you!! This definately helped me out!
One last thing. I just want to make sure I understand what the execution
handler is doing:
So when a request comes in from the client, the execution handler receives
it and fires off the business logic handler in a new thread. From there the
business logic handler can do all its lengthy calculations and not worry
about blocking the execution handler which is responsible for handling the
i/o requests.

Let me know if that's correct.

Once again thanks for clarifying!


Frederic Bregier wrote:
> 
> Hi,
> 
> For 1) The execution handler is included in the pipeline at construction
> (from a factory for instance) and you don't have to take care of it. Its
> goal is "just" to enable a new thread pool to execute the next handlers
> such that those handlers do not run in the IO thread. And as you do
> external request (like SGBD) which could take long time, then you have the
> good idea to include this execution handler.
> So on your question, just include it in the pipeline at construction then
> forget it.
> 
> 2) For the initialization of the connection pool, I would suggest to do it
> before creating the server bootstrap and to pass this connection pool as a
> fix argument to your ChannelPipelineFactory such that any new pipeline
> will create the business handler with this pool as argument like :
> 
> public class YourPipelinbeFactory implements ChannelPipelineFactory {
> private YourPool yourPool;
> private OrderedMemoryAwareThreadPoolExecutor yourExec;
> public YourPipelineFactory(YourPool yourPool) {
>    this.yourPool = yourPool;
>    yourExec = new OrderedMemoryAwareThreadPoolExecutor(...);
> }
> /**
> * Returns a newly created {@link ChannelPipeline}.
> */
> ChannelPipeline getPipeline() throws Exception;
>         ChannelPipeline pipeline = Channels.pipeline();
>         pipeline.addLast("codec", new YourCodec());
>         pipeline.addLast("Exec", yourExec);
>         pipeline.addLast("handler", new YourBusinessHandler(yourPool));
>         return pipeline;
> }
> 
> then in the YourBusinessHandler, you can use the pool to request a new
> connection from the pool.
> 
> 3) No you don't have to make the Handler create a runnable objet. Just
> extends SimpleChannelHandler for instance should be enough. As the
> Executor handler is before the business handler, you already have the
> thread support.
> 
> So in your businessHandler, you could do something like :
> 
> public class YourBusinessHandler extends SimpleChannelHandler {
> private YourPool yourPool;
> public YourBusinessHandler(YourPool  yourPool) {
>    this.yourPool = yourPool
> }
> public void messageReceived(ChannelHandlerContext ctx,
>                             MessageEvent e) {
>    // get the message from e
>    xxx
>    // determine if a request has to be done
>    // if so, get a connection from the pool
>    // then execute the request
>   // determine if a response is needed
>   // if so
>   ctx.getChannel.write(response);
>   // determine if the connection should be closed or not (generaly, the
> client close the connection
>   // but it depends on the logic of the protocol)
> }
> 
> }
> 
> In fact, you are almost there if I get your point... ;-)
> 
> HTH,
> Frederic
> 
> 
> vimana wrote:
>> 
>> Hi,
>> 
>> Thanks for your response. It certainly cleared a number of questions.
>> I'm still a bit unsure of the following:
>> 1. How does the execution handler interact with the process mentioned
>> below?
>> I'm guessing I would need to execute the query using the execution
>> handler? If so, would I need to pass the query to the execution handler
>> using the sendupstream? I'm still confused on how to make use of the
>> execution handler. I've looked at the API and I'm still very confused on
>> this.
>> 
>> 2. Where do I create and initialize my connection pool?
>> 
>> 3. Do I need to create a runnable object in my Business Logic Handler
>> class?
>> 
>> At the moment I'm using my business logic handler to receive the message
>> -> check if the message is to write to a database (no response to send to
>> client), or to retrieve data from the database (response sent back to
>> client as xml). At this point, I was thinking of generating the sql query
>> and passing the query string downstream to the DB Handler. The DB Handler
>> would retrieve a connection from the connection pool and execute the
>> query and the result (if any) would be passed back to the Business Logic
>> Handler. The business logic handler will forward it back to the client
>> using write(Object) which would invoke the encoder codec. But in this
>> process, at which point does the execution handler get invoked? And is
>> there a particular method which I must call upon to invoke the execution
>> handler from within the DB Handler or Business Logic Handler?
>> 
>> Thanks!
>> 
>> 
>> 
>> Frederic Bregier wrote:
>>> 
>>> Hi,
>>> 
>>> I would suggest something in your pipeline like in that order :
>>> 
>>> - handlers for codec (your protocol on how to receive or answer
>>> information)
>>> - handler for execution handler (OrderedMemoryAwareThreadPoolExecutor)
>>> - handler for business
>>> 
>>> In your business, you could make all of your business code, including
>>> the request from the DB pool.
>>> Then you know what and when you need to answer to the client.
>>> 
>>> Another option is as you wrote:
>>> - handlers for codec (your protocol on how to receive or answer
>>> information)
>>> - handler for execution handler (OrderedMemoryAwareThreadPoolExecutor)
>>> - handler for business
>>> - handler for DB connection and queries
>>> 
>>> Then your business just pass the request (if any) to the Db Connection
>>> and Queries handler (using downstream).
>>> The Db Conn & Query handler if needed to answer just write the answer
>>> (in the form you need for instance as an Object) using upstream.
>>> Then the business get the upstream and decide or not to forward it to
>>> the client...
>>> 
>>> But my guess is that only one handler is easier but it greatly depends
>>> on your dev and logic...
>>> 
>>> HTH,
>>> Frederic
>>> 
>>> 
>>> vimana wrote:
>>>> 
>>>> Hi,
>>>> 
>>>> I'm having difficulty understanding how to interface with a DB (MySQL)
>>>> on the Server.
>>>> From what I've gathered, I'll need to create a connection pool (which
>>>> I've done using Apache DBCP), add an execution handler to my pipeline
>>>> (I used the OrderedMemoryAwareThreadPoolExecutor) and my business logic
>>>> handler checks if the request from the client is to save something to
>>>> the db or retrieve something from the db. I then would want the
>>>> business logic handler to pass this request to the execution handler
>>>> which will grab a connection from the connection pool and run the
>>>> query. If the query was to return a result to the client then the
>>>> execution handler would write the result back to the client. I'm not
>>>> sure if this is the correct way to go about it and if it is how do I
>>>> pass the request from the logic handler to execution handler
>>>> (sendupstream?). And How does the execution handler receive the message
>>>> ? Do i attach a runnable object to the context object associated with
>>>> the channel in the business logic handler, sendupstream and then in the
>>>> handleupstream in Executionhandler get the attachment and do a
>>>> .execute((Runnble)ctx.getAttachment())? 
>>>> 
>>>> It would help a lot if I can get a high level overview of the correct
>>>> way to interact with the database.
>>>> 
>>>> Thanks!
>>>> 
>>> 
>>> 
>> 
>> 
> 
> 

-- 
View this message in context: http://n2.nabble.com/Interfacing-with-Database-on-Server-tp3874876p3881358.html
Sent from the Netty User Group mailing list archive at Nabble.com.


More information about the netty-users mailing list