java - 关闭后,带有 SQLite 的 Java 应用程序未在特定计算机上保存操作,.sqlite-journal 未刷新
问题描述
我制作了一个简单的应用程序,用于使用 java + sqlite(netbeans 和 sqlite studio)注册、删除和搜索用户。我在 3 台计算机上进行了测试,一切正常,但是在特定计算机上的行为是:
我打开应用程序一次,执行一些插入和/或删除操作,然后关闭应用程序,一切正常。
我再次打开应用程序并进行更多插入和/或删除,一切正常。
我再次打开,从我执行任何操作的那一刻起,在文件夹中创建一个 .sqlite-journal 文件,当它创建时,我所做的所有操作都不再保存。我关闭了应用程序,它仍然存在。当我重新打开时,更改未保存。
这只发生在这台特定的电脑上,在其他电脑上没有创建 .sqlite-journal 文件,一切正常。
我在 sqlite 网站上读过这个:
“SQLite 通常将所有内容存储在单个磁盘文件中。但是,在执行事务时,在崩溃或电源故障后回滚该事务所需的信息存储在辅助日志文件中。这些日志文件与原始数据库具有相同的名称添加 -journal 或 -wal 后缀的文件。
SQLite 必须查看日志文件才能从崩溃或电源故障中恢复。如果日志文件在崩溃或电源故障后被移动、删除或重命名,则自动恢复将不起作用,数据库可能会损坏。”
我在互联网上看到,在 sqlite 中,所有内容都已设置为自动提交,有时它可能会出错并保存在该日志中。我已经采取了自动提交并在每次操作后手动输入要提交的代码,但没有解决。
删除的代码是(插入类似):
private void cmd_deletarintActionPerformed(java.awt.event.ActionEvent evt) {
// TODO 在此处添加您的处理代码: int p = JOptionPane.showConfirmDialog(null, "Você realmente quer deletar?", "Delete", JOptionPane.YES_NO_OPTION);
if (p==0) {
String sql = "delete from EleitoresInterior where id=?";
try {
conn.setAutoCommit(false);
pst = conn.prepareStatement(sql);
pst.setString(1, txt_idint.getText());
pst.execute();
conn.commit();
JOptionPane.showMessageDialog(null, "Dados apagados!");
}
catch(Exception e) {
JOptionPane.showMessageDialog(null, e);
try {
if (conn != null) {
conn.rollback();
}
} catch (Exception e2) {
JOptionPane.showMessageDialog(null, "Problemas na conexão!");
}
}
finally{
try{
pst.close();
}
catch(Exception e){
}
}
Update_table2();
}
}
在该代码中,当我运行应用程序时,在创建日志文件后,它会出现消息“Problemas na conexão!”,因此在某些时候连接为空,这会导致错误。
解决方案
推荐阅读
- google-bigquery - 更新嵌套数组字段 BigQuery
- mysql - 只有当 T1.column2 的值等于 1 时,我才需要带 T1.column1 的值,如果不是打印'禁用'
- excel - Excel VBA using Selenium - click on href link
- java - 在没有 forceRegenerate 的情况下让 maven jaxb2 插件正常工作的问题
- android - Flutter 默认颜色值
- php - 如何使用 Laravel Fortify 创建身份验证锁屏?
- symfony - Symfony 和 FullCalendar,如何从数据库发送数据
- node.js - 如何使用与 Firebase 函数相同的端口设置 Telegram Webhook?
- javascript - 在 javascript 中执行 curl 请求
- java - 在 Netbeans 上编译:“线程“AWT-EventQueue-0”中的异常 java.lang.RuntimeException:无法编译的源代码 - 表达式的非法开始”