|  | Posted by Venkata Narayana on 08/28/06 04:35 
In the above one, please read it as SELECT 1 instead of SELECT * from 1
 Venkata Narayana wrote:
 > Hi,
 >   You all may be knowing that Connection.isClosed() does not tells us
 > if the underying DB connection is active or not; it only checks if
 > Connection.close() had been previously called or not.
 >   One sure shot way to find out this is by executing some dummy SELECT
 > query and catching it via SQLException.
 >
 >  This could be done in various DB's as follows:
 >   SELECT * from 1  (MS SQL)
 >   SELECT * from DUAL(Oracle)
 >
 > My question is what if you use some other DB , which is not famous as
 > the above.
 > This could still be achieved by creating dummy table with one column
 > and querying it. One pitfall of doing this approach is we may not have
 > create permissions to create table. Even if we have permissions to
 > create table, you need to do the following, if you need to check DB
 > Connection every time.
 >
 >    a) Create Table
 >    b) Use SELECT query
 >    c) Drop table
 >
 > You may ask me why we need to use drop table. This is because, we can
 > not create many tables and keep them alive if we were to check (DB
 > Conn) it for 100 times. One way is we can use IF NOT EXISTS along with
 > Create table. Unfortunately, this command is not supported by all DB
 > vendors. So, this is ruled out.
 >
 > One more way of doing is writing simple stored procedure that returns
 > plain constant. Unfortunatley the syntax for Stored procedures is
 > different for different DB Vendors.
 >
 > So, do we have a correct way of finding if DB connection is active,
 > that would work on all DB's ?
 >
 > Fortunately, there is a way to do this.
 > We could use Connection.getMetaData().getTables(null,null,null,null).
 > We could use this way as this would surely get the number of tables
 > present at that moment. How many tables are present in a DB  will not
 > be cached as this may change dynamically. One disadvantage of using
 > this approach is performance. What if a DB has 1000 tables, it tries to
 > get the names of 1000 tables and it is performance hit.
 >
 >  Is there a solution for this?. Yes, we can use getTables method by
 > invoking only against the SYSTEM table  types. I am sure any DB will
 > not have many system tables.
 > So, our call would be,
 >
 >   Conn.getMetaData().getTables(null,null,null,new String[]{"SYSTEM
 > TABLE"});
 >
 > The above statement is expected to give whether connection is active;
 > if connection is not active, then it throws SQLException. And best part
 > is it will work on all DB Drivers.
 >
 > What if some JDBC driver does not implement the above getTables() call,
 > then we would get some AbstractMethodError that can be caught using
 > LinkageError. So, finally code for checking if connection is active or
 > not is as follows:
 >
 > try {
 >  ResultSet rs = conn.getMetaData().getTables(null,null,null,new
 > String[]{"SYSTEM TABLE"});
 > } catch (SQLException e) {
 >    conn.close();// use try catch block here to catch SQLException for
 > Conn.close();
 >    //call to open new DB connection.
 >    getNewConnection();
 > }catch(LinkageError e){
 >   conn.close();// use try catch block here to catch SQLException for
 > Conn.close();
 >    //call to open new DB connection.
 >    getNewConnection();
 > }
 > }
 >
 >  This limitation (if it can be called) is going to be fixed for JDBC
 > 4.0 implemented drivers(if they implement it in right way).
 >
 > Any comments on this would be appreciated.
 >
 > Regards,
 > Venkata Narayana
  Navigation: [Reply to this message] |