pool de conexiones static o no static?

Buenas tengo una duda , he creado un datasource en el JBoss, y en mi clase tengo esto, pero tengo una duda al momento de abrirla tengo que instanciar la clase conexion , cual es la diferencia si es declarada como static y en lugar de instanciarla donde se vaya a usar , esto afectaria en el performance?, les agradezco su consejo y orientacion

package com.App2.conn;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConexionJNDI {

private static DataSource datasource = null;

public ConexionJNDI() throws Exception{
try {
Context ctx = new InitialContext();

datasource = (DataSource) ctx.lookup( "java:/MyDBDS" );

if ( datasource == null )
{
String message = "Could not find our DataSource in MyDBDS. We're about to have problems.";
System.err.println("*** " + message);
throw new Exception(message);
}
} catch (NamingException e) {
e.printStackTrace();
}
}

/**
* Dole out the connections here.
*/
public static synchronized Connection getConnection()
throws SQLException
{
return datasource.getConnection();
}

/**
* Must close the database connection to return it to the pool.
*/
public static synchronized void cerrarConexion(Connection connection)
{
try
{
connection.close();
}
catch (Exception e)
{
System.err.println("MyDBDS: Threw an exception closing a database connection");
e.printStackTrace();
}
}

}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de julgo

datasource

el datasource solo es necesario que lo recuperes una ves , puede ser estatico y tus métodos también ,pero lo has hecho de la manera equivocada , una mejor opcion es inicializar el datasource en un bloque estatico y te olvidas del tema de tener que instanciarlo o no , en cuanto a tus métodos de abrir y cerrar no tienen por que ser sincronizados el método: datasource.getConnection() es thread safe .

Como lo recuperas una ves?

Como lo recuperas una ves? julgo , gracias por tu amable respuesta, yo lo tengo en una clase asi:

package com.App2.conn;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class ConexionDB2 {
       
   static Context ctx=null;
    static{
        try{
            Properties p=new Properties();
            p.put("java.naming.factory.initial", "org.jnp.interfaces.Naming.CoontextFactory");
            p.put("java.naming.provider.url","localhost:1099");
            p.put("java.naming.factory.url.pkgs","org.jboss.naming");
            ctx=new InitialContext();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
     
    public static Connection getConnection(){
            Connection con=null;
            try{
                Object obj=ctx.lookup("java:/MyDBDS");
                DataSource ds=(DataSource)obj;
                con=ds.getConnection();
            }catch(Exception e){
                e.printStackTrace();
            }
            return con;
    }
   
    public static void cleanup(ResultSet rs,Statement st,Connection con)
    {
        try{
                if(rs!=null)rs.close();
                if(st!=null)st.close();
                if(con!=null)con.close();
            }catch(Exception e){
                e.printStackTrace();
            }
    }
       
    public static  void cerrarConexion(Connection connection)
        {
           try
            {
                   System.out.println("close conexion");
              connection.close();
            }
            catch (Exception e)
            {
              System.err.println("DBMyDSprueba: Threw an exception closing a database connection");
              e.printStackTrace();
            }
        }

}

Y para usarlo en alguna clase lo pongo asi:

....
import java.net.*;
import java.util.*;
import java.io.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import com.App2.conn.*;

...............

Connection conn = null;
Statement stmt = null;
DatabaseMetaData dm = null;
try {
conn = ConexionDB2.getConnection();
dm =conn.getMetaData();
out.println("Connected to-> database version "+dm.getDatabaseProductVersion());

Statement statement = conn.createStatement();
String sql = "select iduser, perfil,pantalla from perfiles";
ResultSet rs = statement.executeQuery(sql);
 
int count = 1;
while (rs.next()) {
    out.println(rs.getString("iduser")+" - "+ rs.getString("pantalla"));
     
}
}catch (Exception sqlex) {
out.println(sqlex.getMessage());
}finally{
        ConexionDB2.cerrarConexion(conn);
}

Espero lo este empleando bien, les agradezco sus comentarios

Gracias

Imagen de julgo

cambia esto   public static

cambia esto

  public static Connection getConnection(){
            Connection con=null;
            try{
                Object obj=ctx.lookup("java:/MyDBDS");
                DataSource ds=(DataSource)obj;
                con=ds.getConnection();
            }catch(Exception e){
                e.printStackTrace();
            }
            return con;
    }

por esto:

  public static Connection getConnection(){
                      return datasource.getconnection();
    }
 

el lookup ponlo en el inicializador estatico -> static { //todo lo que inicializas una ves }

Me quedo asi julgo:   

Me quedo asi julgo:

    static Connection con=null;
    static DataSource ds=null;
    static{
        try{
            Properties p=new Properties();
            p.put("java.naming.factory.initial", "org.jnp.interfaces.Naming.CoontextFactory");
            p.put("java.naming.provider.url","localhost:1099");
            p.put("java.naming.factory.url.pkgs","org.jboss.naming");
            ctx=new InitialContext();
            Object obj=ctx.lookup("java:/sqlserver");
            ds=(DataSource)obj;
        }catch(Exception e){
            e.printStackTrace();
        }
    }

 public static Connection getConnection() throws SQLException{
       
        return ds.getConnection();
    }

Espero asi este mejor, en espera de sugerencias

Gracias

Imagen de julgo

ultimo

ya pero saca  static Connection con=null; no se por que lo tienes y peor aun es static, ten cuidado con compartir las conexiones.
y lo ultimo ya seria que investigues que uso tiene  Properties p=new Properties(); creo que no lo necesitas , aver revisalo y comentas para que a alguien mas le sirva.

Que tal julgo lo deje asi  

Que tal julgo lo deje asi

        private static Context ctx=null;
        private Connection con=null;
        static DataSource ds=null;
    static{
        try{
            ctx=new InitialContext();
            Object obj=ctx.lookup("java:/sqlserver");
            ds=(DataSource)obj;
        }catch(Exception e){
            e.printStackTrace();
        }
    }

   
    public static Connection getConnection() throws SQLException{
       
        return ds.getConnection();
    }
   
    public static void cleanup(ResultSet rs,Statement st,Connection con)
    {
        try{
                if(rs!=null)rs.close();
                if(st!=null)st.close();
                if(con!=null)con.close();
            }catch(Exception e){
                e.printStackTrace();
            }
    }
       
    public static  void cerrarConexion(Connection connection)
        {
           try
            {
                   System.out.println("close conexion");
              connection.close();
            }
            catch (Exception e)
            {
              System.err.println("DBMYDS: Threw an exception closing a database connection");
              e.printStackTrace();
            }
        }

Espero asi no comparta conexiones, en espera de comentarios

Gracias nuevamente