getConnection sempre cria uma nova conexão? ou pega uma já existente?

Pessoal,

Gostaria de saber o getConnection toda vez q for chamado pelas classes é criada uma nova conexão. Segue:

			Connection con = null;
			try{
				Class.forName("oracle.jdbc.driver.OracleDriver");
				con = DriverManager.getConnection("jdbc:oracle:thin:@xxxxxxxx:1521:xxxx","xxxxx","xxxx");
			}catch(ClassNotFoundException e){
				throw new SQLException(e.getMessage());
			}
			return con;

Olá
Creio que esse exemplo que você citou sempre retorna uma nova conexão. Para pegar uma já existente, você precisa usar um pool.

Tenho uma dúvida parecida com a sua: quando utilizamos uma implementação de DataSource (por exemplo, SQLServerDataSource) para obter uma conexão, esta conexão é “pooled”?

Abraços

Ele sempre abre uma nova conexão.

Se vc utilizar pools de conexão. Ele sempre pegara uma conexão do Pool.

para isso vc deve ter um arquivo chamado context.xml no seu META-INF com os seguintes dados:

<?xml version="1.0" encoding="UTF-8"?>

<Context>
<Resource 	name="jdbc/NomeApp" 
		auth="Container"
		type="javax.sql.DataSource"
		username="X" password="X"
		driverClassName="oracle.jdbc.driver.OracleDriver"
		url="jdbc:oracle:thin:@banco:1521:orcl"
		maxActive="30" maxIdle="50" />
</Context>

e o seu connection factory

	public static Connection getConnection()throws SQLException{
		Connection con = null;
		try {
			initDataSource(); // se der exceção a fonte não existe
			if(con==null || con.isClosed()){
				con = dataSource.getConnection();
			}
		} catch (NamingException e) {
			System.out.println("ERROR: O nome JNDI " + FONTE + ". Não foi encontrado!");
		}		
		return con;	
	}


    private static void initDataSource()throws NamingException{    	
    	InitialContext ic = new InitialContext();
    	if(dataSource==null)
    		dataSource = (DataSource) ic.lookup("java:comp/env/" + FONTE);
    }

Até onde eu sei é assim que funciona…pelo menos no Tomcat

[]'s

[quote=Giulliano]Ele sempre abre uma nova conexão.

Se vc utilizar pools de conexão. Ele sempre pegara uma conexão do Pool.

para isso vc deve ter um arquivo chamado context.xml no seu META-INF com os seguintes dados:

<?xml version="1.0" encoding="UTF-8"?>

<Context>
<Resource 	name="jdbc/NomeApp" 
		auth="Container"
		type="javax.sql.DataSource"
		username="X" password="X"
		driverClassName="oracle.jdbc.driver.OracleDriver"
		url="jdbc:oracle:thin:@banco:1521:orcl"
		maxActive="30" maxIdle="50" />
</Context>

e o seu connection factory

	public static Connection getConnection()throws SQLException{
		Connection con = null;
		try {
			initDataSource(); // se der exceção a fonte não existe
			if(con==null || con.isClosed()){
				con = dataSource.getConnection();
			}
		} catch (NamingException e) {
			System.out.println("ERROR: O nome JNDI " + FONTE + ". Não foi encontrado!");
		}		
		return con;	
	}


    private static void initDataSource()throws NamingException{    	
    	InitialContext ic = new InitialContext();
    	if(dataSource==null)
    		dataSource = (DataSource) ic.lookup("java:comp/env/" + FONTE);
    }

Até onde eu sei é assim que funciona…pelo menos no Tomcat

[]'s[/quote]

No seu exemplo eu tenho q usar no if isso aqui tb? con.isClosed()…só o con == null não esta bom?

depende muito da sua aplicação, tem gente que usa simgleton para objetos de conexõa, mas eu não recomento.

Geralmente em aplicações web eu uso uma conexão por thread local, seria algo assim:

public static final ThreadLocal<Connection> thread = new ThreadLocal<Connection>();

public static Connection getConnection()throws SQLException{
	Connection con = null;
	try {
		con = thread.get();
		if(con==null || con.isClosed()){
			con = dataSource.getConnection();
			thread.set(con);
		}
	} catch (Exception e) {
		// trate a exceção aqui
	}	
return con;	
}

public static void closeConnection(){
	Connection con = thread.get();
	try {
		if(con != null && !con.isClosed())
			con.close();
	} catch (SQLException e) {
// trate a exceção aqui   
		e.printStackTrace();
	}
}

[quote=eduacsp][quote=Giulliano]Ele sempre abre uma nova conexão.

	public static Connection getConnection()throws SQLException{
		Connection con = null;
		try {
			initDataSource(); // se der exceção a fonte não existe
			if(con==null || con.isClosed()){
				con = dataSource.getConnection();
			}
		} catch (NamingException e) {
			System.out.println("ERROR: O nome JNDI " + FONTE + ". Não foi encontrado!");
		}		
		return con;	
	}


    private static void initDataSource()throws NamingException{    	
    	InitialContext ic = new InitialContext();
    	if(dataSource==null)
    		dataSource = (DataSource) ic.lookup("java:comp/env/" + FONTE);
    }

Até onde eu sei é assim que funciona…pelo menos no Tomcat

[]'s[/quote]

No seu exemplo eu tenho q usar no if isso aqui tb? con.isClosed()…só o con == null não esta bom?[/quote]

no caso dele que sempre inicializa a conexão como null não precisaria, mas no meu sim :wink: