What's the problem to call HConnectionManager.getConnection in Servlet.init
method and pass it to your class responsible for HBase interaction?


2015-02-13 14:49 GMT+03:00 Sleiman Jneidi <jneidi.slei...@gmail.com>:

> a single HConnection
>
> On Fri, Feb 13, 2015 at 11:12 AM, Serega Sheypak <serega.shey...@gmail.com
> >
> wrote:
>
> > What are you trying to achieve?
> >
> > 2015-02-13 12:36 GMT+03:00 Sleiman Jneidi <jneidi.slei...@gmail.com>:
> >
> > > To be honest guys I am still confused, especially that that HConnection
> > > implements Closeable  and hence everyone has the right to close the
> > > connection. I wrote this code to manage connections but I am not sure
> > about
> > > its correctness.
> > >
> > >
> > > private static class HConnectionProvider {
> > >
> > >   private static HConnection hConnection;
> > >
> > >  private static final Lock LOCK = new ReentrantLock();
> > >
> > >   static {
> > >
> > >  hConnection = createNewConnection();
> > >
> > >    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
> > >
> > >     @Override
> > >
> > >   public void run() {
> > >
> > >   if(hConnection!=null && !hConnection.isClosed()){
> > >
> > >    try {
> > >
> > >    hConnection.close();
> > >
> > >    } catch (IOException e) {
> > >
> > >    e.printStackTrace();
> > >
> > >    }
> > >
> > >   }
> > >
> > >   }
> > >
> > >  }));
> > >
> > >  }
> > >
> > >   public static HConnection connection(){
> > >
> > >  if(!hConnection.isClosed()){
> > >
> > >   return hConnection;
> > >
> > >  }
> > >
> > >  boolean acquired = false;
> > >
> > >  try{
> > >
> > >   acquired = LOCK.tryLock(5,TimeUnit.SECONDS);
> > >
> > >   if(hConnection.isClosed()){
> > >
> > >   hConnection = createNewConnection();
> > >
> > >   }
> > >
> > >   return hConnection;
> > >
> > >     } catch (InterruptedException e) {
> > >
> > >   throw new RuntimeException(e);
> > >
> > >  }finally{
> > >
> > >   if(acquired){
> > >
> > >   LOCK.unlock();
> > >
> > >   }
> > >
> > >  }
> > >
> > >    }
> > >
> > >   private static HConnection createNewConnection(){
> > >
> > >  try {
> > >
> > >   HConnection connection = HConnectionManager.createConnection(config);
> > >
> > >   return connection;
> > >
> > >  } catch (IOException e) {
> > >
> > >   throw new RuntimeException(e);
> > >
> > >  }
> > >
> > >  }
> > >
> > >   }
> > >
> > > On Fri, Feb 13, 2015 at 8:57 AM, Serega Sheypak <
> > serega.shey...@gmail.com>
> > > wrote:
> > >
> > > > Hi, really, I can share one Hconnection for the whole application.
> > > > It's done by design. I have several servlets. Each servlet has 1-2
> > > > controllers working with hbase internally (put/get/e.t.c)
> > > > Right now I don't see any reason to refactor code and share single
> > > > HConnection for all controllers in servlets.
> > > >
> > > >
> > > > 2015-02-13 6:56 GMT+03:00 David chen <c77...@163.com>:
> > > >
> > > > > Hi Serega,
> > > > > I am very interesting in the reason why per application need to
> > create
> > > 5
> > > > > instead of only one HConnection instances during servlet
> > > initialization?
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > At 2015-02-04 01:01:38, "Serega Sheypak" <serega.shey...@gmail.com
> >
> > > > wrote:
> > > > > >Hi, guys from group helped me a lot. I did solve pretty the same
> > > problem
> > > > > >(CRUD web-app)
> > > > > >
> > > > > >1. Use single instance of HConnection per application.
> > > > > >2. Instantiate it once.
> > > > > >3. create HTable instance for each CRUD operation and safely close
> > it
> > > > > >(try-catch-finally). Use the same HConnection to create any HTable
> > for
> > > > > CRUD
> > > > > >operation.
> > > > > >4. DO NOT close HConnection after CRUD operation
> > > > > >
> > > > > >I have logic controllers which get HConnection injection in
> > > > > >HttpServlet.init method.
> > > > > >So I have 5 HConnection instances per application created during
> > > servlet
> > > > > >initialization
> > > > > >
> > > > > >
> > > > > >2015-02-03 18:12 GMT+03:00 Ted Yu <yuzhih...@gmail.com>:
> > > > > >
> > > > > >> Please see '61.1. Cluster Connections' under
> > > > > >> http://hbase.apache.org/book.html#architecture.client
> > > > > >>
> > > > > >> Cheers
> > > > > >>
> > > > > >> On Tue, Feb 3, 2015 at 6:47 AM, sleimanjneidi <
> > > > jneidi.slei...@gmail.com
> > > > > >
> > > > > >> wrote:
> > > > > >>
> > > > > >> > Hi all,
> > > > > >> > I am using hbase-0.98.1-cdh5.1.4 client and I am a bit
> confused
> > by
> > > > the
> > > > > >> > documentation of HConnection. The document says the following:
> > > > > >> >
> > > > > >> > HConnection instances can be shared. Sharing is usually what
> you
> > > > want
> > > > > >> > because rather than each HConnection instance having to do its
> > own
> > > > > >> > discovery of regions out on the cluster, instead, all clients
> > get
> > > to
> > > > > >> share
> > > > > >> > the one cache of locations. HConnectionManager does the
> sharing
> > > for
> > > > > you
> > > > > >> if
> > > > > >> > you go by it getting connections. Sharing makes cleanup of
> > > > > HConnections
> > > > > >> > awkward. .
> > > > > >> >
> > > > > >> > So now I have a simple question: Can I share the same
> > HConnection
> > > > > >> instance
> > > > > >> > in my entire application?
> > > > > >> > And write some magic code to know when to close or never close
> > at
> > > > all?
> > > > > >> > Or I have to create an instance and close it every time I do a
> > > CRUD
> > > > > >> > operation ?
> > > > > >> >
> > > > > >> > Many thanks
> > > > > >> >
> > > > > >> >
> > > > > >> >
> > > > > >>
> > > > >
> > > >
> > >
> >
>

Reply via email to