Essa classe para conexão com o banco está boa?

Estou fazendo uma aplicação web sem usar Hibernate. Portanto criei essa classe para conexão com o banco:

package eco.mapas.util;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class Conexao {

	private static Connection conn;

	static {

		Properties props = new Properties();

		try {
			InputStream is = Conexao.class.getClassLoader().getResourceAsStream("conexao.properties");
			props.load(is);
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException ex) {
			ex.printStackTrace();
		}

		try {
			Class.forName(props.getProperty("driver"));
			conn = DriverManager.getConnection(
					props.getProperty("url"),
					props.getProperty("user"),
					props.getProperty("password"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	private Conexao() {

	}

	public static Connection getConexao() {
		return conn;
	}

}

Essa classe lê os parâmetros de conexão do arquivo conexao.properties que fica no diretório WEB-INF/classes.

Para pegar a conexão em qualquer classe da aplicação eu chamo:

Está bom assim ou tem maneira melhor de fazer conexão com o banco?

Pelo o que eu vi sua aplicação é web, use um datasource para gerenciar suas conexões.

Poderia explicar melhor como faço isso?

É complicado?

Devo criar uma classe que implementa javax.sql.DataSource?

eu uso um esquema parecido com este seu ai aqui onde trabalho, mas também tem o esquema de datasource como o amigo ja falou, vai de vc escolher qual vc acha melhor. usando datasource vc ira colocar as configurações de conexão dentro do XML context.xml que sua aplicação obrigatoriamente ja deve ter que ter (caso tomcat não conheços os demais servidores). mas a sua solução é eficiente, só para ficar melhor talvez eu tornaria a conexão um singleton com um spool e uma fila.

Uma boa opção é o c3p0.

Poderia explicar melhor como faço isso?

É complicado?

Devo criar uma classe que implementa javax.sql.DataSource?[/quote]

De uma olhada nesse post:

http://www.guj.com.br/posts/list/17285.java

[code]
public class DAOUtils {
public static final String DATASOURCE_NAME = “java:comp/env/jdbc/datasource”;

public static final String OPEN_DATASOURCE = "Erro acessando a fonte de dados";    

public static final String OPEN_CONNECTION = "Erro durante abertura da conexao";    

public static final String CLOSE_RESULTSET = "Erro durante fechamento do resultset";    

public static final String CLOSE_STATEMENT = "Erro durante fechamento do statement";    

public static final String CLOSE_CONNECTION = "Erro durante fechamento da conexao";

public static final String ROLLBACK_CONNECTION = "Erro durante rollback da conexão";

public static final String SQL_ERROR = "Erro durante execucao da instrucao SQL";

private static Map cache = Collections.synchronizedMap(new HashMap());

private static DataSource getDataSource() throws DAOException {      
    try {
        Context ic = new InitialContext();
        String dsname = (String) ic.lookup(DATASOURCE_NAME);

        DataSource source = (DataSource) cache.get(dsname);
        if (source == null) {
            source = (DataSource) ic.lookup(dsname);
            cache.put(dsname, source);
        }
            
        return source;
    }
    catch (NamingException nae) {
        throw new DAOException(OPEN_DATASOURCE, nae);
    }
}

public static Connection getConnection() throws DAOException {
    DataSource source = getDataSource();
    
    try {
        return source.getConnection();
    }
    catch (SQLException sqle) {
        throw new DAOException(OPEN_CONNECTION, sqle);
    }
}

public static void rollbackConnection(Connection connection) {
    try {
        if (connection != null && !connection.isClosed()) {
            connection.rollback();
        }
    } 
    catch (SQLException sqle) {
        throw new DAOException(ROLLBACK_CONNECTION, sqle);
    } 
}

public static void closeResultset(ResultSet resultset) throws DAOException {
    try {
        if (resultset != null) {
            resultset.close();
            resultset = null;
        }
    } 
    catch (SQLException sqle) {
        throw new DAOException(CLOSE_RESULTSET, sqle);
    }
}

public static void closeStatement(PreparedStatement statement) throws DAOException {
    try {
        if (statement != null) {
            statement.close();
        }
    } 
    catch (SQLException sqle) {
        throw new DAOException(CLOSE_STATEMENT, sqle);
    }

}

public static void closeConnection(Connection connection) throws DAOException {
    try {
        if (connection != null && !connection.isClosed()) {
            connection.close();
        }
    } 
    catch (SQLException sqle) {
        throw new DAOException(CLOSE_CONNECTION, sqle);
    } 
}

}[/code]

eu uso essa classe para conectar com o banco, as propriedades de acesso ao banco vc pode configurar no oracle-ds.xml no caso do JBOSS:

<datasources>
    <local-tx-datasource>
        <jndi-name>jdbc/pesquisa</jndi-name>
        <connection-url>jdbc:oracle:thin:@//servidor:porta/instance</connection-url>
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <user-name>usuario</user-name>
        <password>senha</password>

        </local-tx-datasource>
</datasources>

Java Player, a primeira mudança que eu te indico é mudar o nome da classe. Quando der nomes a classes, pense sempre na responsabilidade que ela tem.

No seu caso, a classe não é uma Conexao; ela serve para criar conexões. Por isso um nome como FabricaDeConexoes seria mais adequado.

É muito melhor usar um DataSource mesmo. Verifique na doc do seu container web como defini-lo.

Uma coisa que percebi é que você usa uma conexão para todos as requisições enquanto a aplicação está no ar. Já pensou o que pode acontecer se um desenvolvedor dá um conn.comit() no meio do tratamento de exceção ou outro? Acho que vale uma revisão de como tratar a concorrência de usuarios ao acessar a conexão.