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();
}
}
}
- Inicie sesión o regístrese para enviar comentarios
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:
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
cambia esto public static
cambia esto
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:
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 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
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 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