我最近面临着一个

org.sqlite.SQLiteException:[SQLITE_BUSY]数据库文件被锁定(数据库被锁定)

在我的桌面应用程序上出现错误,因为我认为我使用了单个连接来跨我的方法读写数据.因此,我从使用单个连接改为在每次读写我的应用程序时创建一个新连接.为 例如,在读取数据的每种方法中,我都做到了:

try {
    Connection connection = DriverManager.getConnection(url);
    // rest of my code
    connection.close();
}
catch (SQLException e) {
    e.printStackTrace();
}

Note, that it fixed my issue.

我的问题是,做我刚才描述的事情会有什么影响吗?

推荐答案

读取和写入数据也需要关闭资源,如StatementResultSet.这些资源需要在每次查询后关闭.如果您忘记关闭资源,那么您将面临资源泄漏,这是内存泄漏问题的一种情况.每次你对数据库进行查询时,它都会打开一个事务,如果自动提交模式是打开的,则会在语句执行后结束事务.

Connection对象应该在方法的结尾处关闭.如果没有关闭连接,它将保持活动并保留内存,这会造成内存泄漏(也称为资源泄漏).在Java 8及更高版本中,该对象实现AutoClosable接口,并可与try-with-resources语句一起使用.这与StatementResultSet相关,您应该相应地关闭它们.但是,如果您显式关闭连接,则这些对象也将关闭.

try (Connection connection = db.getConnection();) {
 //your code here                         
}catch(SQLException e) {
 db.getErrorMessages(e);
}     

事务锁定数据库资源,但如果不同的线程使用相同的资源,它们可能会造成死锁问题.为了避免在使用JDBC时可能遇到的这些和许多其他问题,请使用每线程连接模式,并在资源使用后关闭它们.

您有两个 Select :

  1. 每次执行查询时获取一个新连接,然后关闭它以及所有资源.
  2. 使用数据源获取连接.这需要为您的应用程序配置一个连接池.

使用哪种方法取决于应用程序的用户要求.

Java相关问答推荐

如何在Docker容器中使用wireock—Webhooks阻止请求?

空手道比赛条件

Spring boot:Bean和动态扩展器

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

尽管类型擦除,instanceof与泛型在Java中如何工作?

@ IdClass with @ Inheritance(策略= InheritanceType. SINGLE_TABLE)

Java .类参数不通过构造函数传递

这是什么Java构造`(InputStream Is)->;()->;{}`

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

Spring-Boot Kafka应用程序到GraalVM本机映像-找不到org.apache.kafka.streams.processor.internals.DefaultKafkaClientSupplier

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

将JSON字符串转换为Java类

视图被推出线性布局-Android

为什么相同的数据条码在视觉上看起来不同?

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

ResponseEntity.控制器截断响应的JSON部分

java 11上出现DateTimeParseException,但java 8上没有

如何使用Jackson读取以方括号开头的JSON?