Hsqldb (stand-alone) da commit só de vez em quando

10 respostas
jason_bourne

Pessoal,

Estou com um problema na aplicação que fiz com swing. Na maioria das vezes que tendo editar os dados de um usuário usando esse metódo:

public class FuncionarioSQL implements ListSelectionListener {

static final String JDBC_DRIVER = "org.hsqldb.jdbcDriver";        
static final String DATABASE_URL = "jdbc:hsqldb:file:/caminho/stock";
static final String USERNAME= "sa";
static final String PASSWORD= "";
public static JTable resultTable;
static ResultSet resultSet =null;
static ResultSet resultSet2 =null;
public static Component bAlterar = null;
public static String NomeUser = null;
public static String CargoUser = null;
public static Connection connection =null;
public static Statement statement = null;


public static void AlterarConf(int idFunc,
			String nome,
			String login,
			String senha,
			JTextField txtNascimento,
			String endereco,
			String RG,
			String CPF,
			JComboBox cargo,
			JComboBox ativo){

	
try{
try {
Class.forName(JDBC_DRIVER);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
try {
connection = DriverManager.getConnection(DATABASE_URL,USERNAME,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}

String SQL = "UPDATE  tabela SET " +
"nome='"+nome+"',"+
"login='"+login+"',"+
"senha='"+senha+"',"+
"data_nasc="+Data.converteData(txtNascimento.getText())+","+
"endereco='"+endereco+"',"+
"rg='"+RG+"',"+
"cpf='"+CPF+"',"+
"ativo='"+(String)ativo.getSelectedItem()+"',"+
"cargo='"+(String)cargo.getSelectedItem()+"'"+
" WHERE idfunc="+idFunc;

System.out.println("->"+SQL);

try {
int rows=0; 
statement = connection.createStatement();
rows = statement.executeUpdate(SQL); 

System.out.println("OK ->"+rows);
} catch ( SQLException sqlException )   {
System.out.println("Erro SQL!");
sqlException.printStackTrace();
System.exit( 1 );
}
}finally {                                                             
try {                                                          
statement.close();                                      
connection.close();                                     
} catch ( Exception exception ) {                                                          
exception.printStackTrace();                                     
System.exit( 1 );                                       
} // end catch                                             
} // end finally               



JOptionPane.showMessageDialog(bAlterar,"Alterado!");
JOptionPane.getRootFrame().dispose();

}

}

…simplesmente não faz o commit

Só que eu tenho que fechar o JInternalFrame e abrir-lo denovo e alterar os dados denovo para que faça o commit. As vezes nem isso resolve. Eu estou comendo bola em alguma coisa? pq eu ja pesquisei em vários sites e me parece que o meu método esta correto.

10 Respostas

T

“Autocommit” no HSQLDB (e em outros bancos) está desativado por default. Você tem de usar o método setAutoCommit(true) da interface Connection, logo depois de abrir a conexão, se não quiser usar os métodos “commit” e “rollback” da interface Connection.

jason_bourne

thingol:
“Autocommit” no HSQLDB (e em outros bancos) está desativado por default. Você tem de usar o método setAutoCommit(true) da interface Connection, logo depois de abrir a conexão, se não quiser usar os métodos “commit” e “rollback” da interface Connection.

Ficaria assim então:

try {
 connection = DriverManager.getConnection(DATABASE_URL,USERNAME,PASSWORD);
connection.setAutoCommit(true);
 } catch (SQLException e) {
 e.printStackTrace();
 }

???

pq mesmo usando o setAutoCommit(true) não vai…eu altero e logo em seguida fecho a aplicação e depois abro denovo, e vou ver não esta la mais a alteração.

T

Se você não vai usar um framework como o Spring ou algo que já tome conta de suas transações, pode usar o método “commit” ou “rollback” da interface Connection.

Pelo javadoc de java.sql.Connection, o auto-commit deveria estar ligado por default, mas pela documentação do hsqldb, ele está desligado por default - ou seja, o driver não obedece 100% à especificação.

jason_bourne

thingol:
Se você não vai usar um framework como o Spring ou algo que já tome conta de suas transações, pode usar o método “commit” ou “rollback” da interface Connection.

Pelo javadoc de java.sql.Connection, o auto-commit deveria estar ligado por default, mas pela documentação do hsqldb, ele está desligado por default - ou seja, o driver não obedece 100% à especificação.

Então, mas mesmo usando o setAutoCommit(true) não vai… :frowning:

T

Uai, pode ser que sua string SQL esteja errada. Copie-a para o DatabaseManager do HSQLDB e veja se não há algum erro de sintaxe bobo.

jason_bourne

não…esta correta

grprado

Tente colocar um ponto e virgula após a url e o texto shutdown=true,

assim:

static final String DATABASE_URL = "jdbc:hsqldb:file:/caminho/stock;shutdown=true";

É para funcionar.

Outro detalhe que eu não me lembro onde li, mas já reparei e existe até uma opçao de configuraçao, é que o hsqldb por padrão só grava os dados de tempos em tempos, mesmo você dando commit a gravação fisica vai demorar um pouco para acontecer.

jason_bourne

grprado:
Tente colocar um ponto e virgula após a url e o texto shutdown=true,

assim:

static final String DATABASE_URL = "jdbc:hsqldb:file:/caminho/stock;shutdown=true";

É para funcionar.

Outro detalhe que eu não me lembro onde li, mas já reparei e existe até uma opçao de configuraçao, é que o hsqldb por padrão só grava os dados de tempos em tempos, mesmo você dando commit a gravação fisica vai demorar um pouco para acontecer.

Eu coloquei o shutdown=true e não funcionou tb :frowning: . Eu fiz um teste usando um console para acessar o hsqldb, e dando o comando update e depois o comando commit, ele grava fisicamente no banco. Mas já usando a aplicação isso não ocorre. Eu realmente não entendo o pq, afinal o código parece estar certo.

renatotn7

olá estou com o mesmo problema alguem mais consegue ajudar??

renatotn7

para o caso de alguem precisar acabei de resolver o problema por aqui
alterando no arquivo de script que o banco gera, o valor default

SET FILES WRITE DELAY 10
para
SET FILES WRITE DELAY 0

é so alterar e salvar

abs

Criado 20 de abril de 2006
Ultima resposta 26 de mar. de 2010
Respostas 10
Participantes 4