JDBC - Transações/Performance/Qualidade de código/Padrao

Ola pessoal
eu tenho uma duvida sobre JDBC
bem, eu uso banco de dados SQL Server 2005 com o driver JTDS.

considerem essa classe

public class Pessoa  implements Serializable {

    private int id;
    private String nome;
    private String documento;
    private Date nascimento;
    private Logradouro logradouro = new Logradouro();
    private List<Telefone> telefones = new ArrayList<Telefone>();
    private List<Email> emails = new ArrayList<Email>();
...
//get e sets

detalhes:
considerem o cadastro no Banco no padrao DAO.
no Banco, todos os cadastro sao feitos por procedures
procedures de cadastro/update utilizam de transacoes e isso nao vai ser REMOVIDO das procedures

1-em questao de performance e qualidade de código e padroes, é melhor:
1.1-utilizar uma procedure onde ela cadastra pessoa,email e telefone de uma unica vez
1.2-separar em 3 cadastro
1.3-utlizar o 1.1 e 1.2 ao mesmo tempo, criando classe de cadastro separadas e em uma unica classe, fazer os 3 cadastro em sequencia?
1.4-outro,qual?

2-como eu uso transacoes no java(codigo, como eu escrevo uma transacao)?

3-transacoes: caso eu opte pela opcao 1.2 ou 1.3, se eu abilitar a transacao no java, eu posso ter problemas por causa da transacao do sql? alguem ja fez isso?

4-utilizando transacao no DB e no Java, eu perco muito em performance?

acho que é so ate agora

abs
T+

Vou te responder baseado no Oracle (que é o banco que tenho mais afinidade).

1-em questao de performance e qualidade de código e padroes, é melhor:

1.1-utilizar uma procedure onde ela cadastra pessoa,email e telefone de uma unica vez
:arrow:Se você não quer correr das procedure, faça assim. O único motivo de separar isto seria
o reuso de uma das parte em outro ponto do projeto.

2-como eu uso transacoes no java(codigo, como eu escrevo uma transacao)?
:arrow:Leia a documentação do objeto de conexão. Na net tem vários exemplos.

3-transacoes: caso eu opte pela opcao 1.2 ou 1.3, se eu abilitar a transacao no java, eu posso ter problemas por causa da transacao do sql? alguem ja fez isso?
:arrow:No Oracle vc teria, pois ao comitar uma transação dentro do procedumento, serviria para as transações de fora. O ideal mesmo seria não ter controle de transação (commit) dentro dos procedimentos. Mas, como vc disse…

4-utilizando transacao no DB e no Java, eu perco muito em performance?
:arrow:O controle de transação é do banco (estamos falando de JDBC, não é?).

[quote=marciosantri]Vou te responder baseado no Oracle (que é o banco que tenho mais afinidade).

1-em questao de performance e qualidade de código e padroes, é melhor:

1.1-utilizar uma procedure onde ela cadastra pessoa,email e telefone de uma unica vez
:arrow:Se você não quer correr das procedure, faça assim. O único motivo de separar isto seria
o reuso de uma das parte em outro ponto do projeto.

2-como eu uso transacoes no java(codigo, como eu escrevo uma transacao)?
:arrow:Leia a documentação do objeto de conexão. Na net tem vários exemplos.

3-transacoes: caso eu opte pela opcao 1.2 ou 1.3, se eu abilitar a transacao no java, eu posso ter problemas por causa da transacao do sql? alguem ja fez isso?
:arrow:No Oracle vc teria, pois ao comitar uma transação dentro do procedumento, serviria para as transações de fora. O ideal mesmo seria não ter controle de transação (commit) dentro dos procedimentos. Mas, como vc disse…

4-utilizando transacao no DB e no Java, eu perco muito em performance?
:arrow:O controle de transação é do banco (estamos falando de JDBC, não é?).[/quote]

bem, acho que devem funcionar da mesma forma os 2 bancos

1.1: bem, vou utilizar tudo de uma so vez, eu acho ate mais facil na hora de mecher no java, fica um código um pouco “comprido”, mas no final, acaba dando menos trabalho, mas, como nem tudo que da menos trabalho é o certo, acabei perguntando

2:ja dei uma procurada, e ja vi como se faz, valeu

3:entao tu me recomenda utilizar a transacao do java ou invez do SQL?(levando em consideracao que vou utilizar apenas 1)

4:suponho que sim, estou usando o driver JTDS, ele “roda” em JDBC certo?

bem, da uma olhada nesta classe, praticamente todas tem a mesma estrutura, vou postar esta, que é a que tem menos campos

...
	final String INSERT 				= "EXEC SPEmailInsert ?,?,?";
	final String BUSCA_POR_PARAMETRO 	= "EXEC SPEmailBusca ?,?";
	final String UPDATE 				= "EXEC SPEmailUpdate ?,?,?";
...
	public void update(Email email, RetornoProcedure retornoProcedure) throws KrusstException {
		Connection 			conn  		= null;
		ResultSet 			rs 			= null;
		String 				sql 		= UPDATE;

		try {

			conn = GerenciadorConexao.getConexao();
			CallableStatement clblStmt = conn.prepareCall(sql);  
			
			clblStmt.setInt(1, email.getId());
			clblStmt.setString(2,email.getDescr());
			clblStmt.setInt(3, email.getTipoId().getId());

			rs = clblStmt.executeQuery();
			if(rs.next()){
				retornoProcedure.setErroId(rs.getInt("ErroID"));
				retornoProcedure.setErroMensagem(rs.getString("ErroMensagem"));
				retornoProcedure.setCadastroId(rs.getInt("CadastroID"));					
			}

		} catch (Exception e) {
				throw new KrusstException("erro no update",e);
		}
	}
...

deixando delado a parte transacao, esta implementada da forma correta este metodo?

abs
e obrigado pela ajuda

T+

A transação vc implementa mais ou menos assim:

[code]…
final String INSERT = “EXEC SPEmailInsert ?,?,?”;
final String BUSCA_POR_PARAMETRO = “EXEC SPEmailBusca ?,?”;
final String UPDATE = “EXEC SPEmailUpdate ?,?,?”;

public void update(Email email, RetornoProcedure retornoProcedure) throws KrusstException {
Connection conn = null;
ResultSet rs = null;
String sql = UPDATE;

    try {   

        conn = GerenciadorConexao.getConexao();   
        CallableStatement clblStmt = conn.prepareCall(sql);     
           
        clblStmt.setInt(1, email.getId());   
        clblStmt.setString(2,email.getDescr());   
        clblStmt.setInt(3, email.getTipoId().getId());   

        rs = clblStmt.executeQuery();   
        if(rs.next()){   
            retornoProcedure.setErroId(rs.getInt("ErroID"));   
            retornoProcedure.setErroMensagem(rs.getString("ErroMensagem"));   
            retornoProcedure.setCadastroId(rs.getInt("CadastroID"));                       
        }   

        conn.commit; /* AQUI E UM PONTO */

    } catch (Exception e) {   

        conn.rollback; /* AQUI E OUTRO PONTO */

            throw new KrusstException("erro no update",e);   
    }   
}   


[/code]

Vc também tem rollbacks com savepoints. Dá uma pesquisa tb.

Agora sobre estar certo ou errado, vai aquela velha questão: depende.
Existem aqueles que vão te indicar um Hibernate ou algum framework.
Mas do jeito que vc fez funciona.

Sobre utilizar o controle de transação na aplicação eu sou completamente à favor.
Digamos que vc tenham 5 procedimentos no banco que vc quer rodá-los em sequência mas vc quer a segurança que se der pau no quinto nada seja feito. Se vc joga um commit dentro do procedimento, isto não é possível ficando a coisa pela metade (até o quarto procedimento). Isto na minha opinião é terrível.

Eu usaria controle de transação dentro do banco em algumas exceções, estas quais não tenho visto há mais de 5 anos.

Inté.

Ah, e não se esqueça do conn.setAutoCommit(false).

Inté

[quote=marciosantri]A transação vc implementa mais ou menos assim:

[/quote]

Meu, não se esqueça de fechar o CallableStatement, isso é muito importante. E faça isso dentro do finally.