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 <[email protected]>
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 <[email protected]>:
>
> > 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" <[email protected]>
> 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 <[email protected]>:
> > >
> > >> 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 <
> [email protected]
> > >
> > >> 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
> > >> >
> > >> >
> > >> >
> > >>
> >
>