Trigger pulando numeros no Oracle

Para evitar que eu pule numeros na sequence, eu criei uma trigger assim:

String TRIGGER="CREATE OR REPLACE TRIGGER CLIENT_TRIGGER"+
         " BEFORE INSERT ON CLIENT FOR EACH ROW"+
		  " BEGIN "+
            " SELECT CLIENTSEQ.NEXTVAL INTO :NEW.ID FROM DUAL; "+
            "END;";

Mas ao criar um cliente isso vai na primeira execução:

Entrou no insert:
ID do CLIENT após o insert:2

E na segunda vez:

Entrou no insert:
ID do CLIENT após o insert:4

Meu insert:

try{				int sequence=0;
				  stmt = this.connection.prepareStatement("SELECT CLIENTSEQ.NEXTVAL FROM DUAL");
				             ResultSet result = stmt.executeQuery();
				              if (result.next()) {
				                  sequence=(int)result.getLong(1);
				              } else {
				                   System.out.println("primary-key não encontrada!");
				                   throw new SQLException("PK not found!");
				              }
				 result.close();             
				 stmt.clearParameters();	   
		
		   stmt = (PreparedStatement) this.connection.prepareStatement(INSERT);
		   System.out.println("Entrou no insert:");
		              stmt.setInt(1, sequence);
			      stmt.setString(2, obj.getName());
                                      stmt.executeUpdate();
				      stmt.close();				        
		       }catch(Exception e){
		            throw new RuntimeException(e);
		       }
CREATE SEQUENCE CLIENTSEQ INCREMENT BY 1

como eu recupero o ID:

//faz o insert do Client        
            new ClientDao().insert(c);  
           //pega o id do último registro   
           int id_c=new DBUtils().getSequence(Conexao.getConnection(),"SELECT CLIENTSEQ.CURRVAL FROM DUAL");              
        System.out.println("ID do CLIENT após o insert:"+id_c); 

Porquê isso ocorre(de pular de 2 em 2)?Como resolver?

Será que na hora que você criou a sequence o parâmetro INCREMENT BY foi configurado com o valor 2 ao invés de 1 ?

O parâmetro CACHE também é importante pois caso ocorra varias conexões o banco oracle pode considerar esse parâmetro para “distribuir” os sequenciais pelas conexões.

Abaixo segue um exemplo :

Exemplo:

CREATE SEQUENCE supplier_seq
  MINVALUE 1
  START WITH 1
  INCREMENT BY 1
  CACHE 20;

OU

CREATE SEQUENCE supplier_seq
  MINVALUE 1
  START WITH 1
  INCREMENT BY 1
  NOCACHE;

De uma olhada como o amigo acima informou, você está retornando o ID para o java e depois pela trigger ?? se for ai está o problema pois ele pega um id e vai pro java e quando vc faz o insert ele vai buscar o proximo numero.

Estou retornando o CURRVAL para a TRIGGER, não o NEXTVAL…e minha sequence começa em 1.Eu pensei que com a TRIGGER ela garantiria a numeração sequencial…

O NOCACHE funciona(e não precisa nem de TRIGGER para isso), mas ele não é uma garantia confiável como falaram em outro post.

Com Sequence não há como ter essa garantia.

A pergunta é: por que você precisa disso?

Se for realmente necessário, pode emular o comportamento de uma sequence.
Mas isso implica em criar um gargalo nessa tabela.
Um novo número só será gerado quando todas transações envolvendo essa pseudo-sequence acabarem.

Um requisito muito comum e semelhante a esse (não deixar pular números) é um mais tosco, que é o de reaproveitar números (argh).

Imagine se eu fosse pedir um RG novo para meu filho e ele recebesse um número de RG de um preso que acabou de morrer na cadeia… Quanta dor de cabeça ele não passaria a ter.