我最近面对一个
org.sqlite.SQLiteException:[SQLITE_忙碌]数据库文件被锁定(数据库被锁定)
在我的桌面应用程序上出现了一个错误,因为我认为我使用了单个连接来跨方法读取和写入数据。所以,我从使用单个连接改为每次阅读和写入应用程序时创建一个新连接。例如,在每个阅读数据的方法中,我都这样做了:
try {
Connection connection = DriverManager.getConnection(url);
// rest of my code
connection.close();
}
catch (SQLException e) {
e.printStackTrace();
}
字符串
注意,它解决了我的问题。
我的问题是,做我上面描述的事情有什么影响吗?
1条答案
按热度按时间6fe3ivhb1#
阅读和写数据也需要关闭资源,如
Statement
和ResultSet
。这些资源需要在每次查询后关闭。如果你忘记关闭资源,那么你将面临资源泄漏,这是内存泄漏问题的一种情况。每次你对数据库进行查询时,它都会打开一个事务,如果自动提交模式打开,则会在执行语句后结束它。Connection
对象应该在方法结束时关闭。如果你没有关闭连接,它将保持活动状态并保留内存,它会强制内存泄漏(也称为资源泄漏).在java 8及以上版本中,此对象实现AutoClosable
接口,可以与try-with-resources语句一起使用。同样的情况也与Statement
和ResultSet
有关,您应该关闭但是如果你显式地关闭连接,那么这些对象也会关闭。字符串
事务锁定数据库资源,但如果不同的线程使用相同的资源,它们可能会造成死锁问题。为了避免这些问题以及使用JDBC时可能遇到的许多其他问题,请使用每个线程的连接模式,并在资源使用后关闭资源。
你有两个选择:
1.每次执行查询时获取一个新连接,然后沿着关闭所有资源。
1.使用数据源获取连接。这需要为应用程序配置连接池。
使用哪种方法取决于应用程序的用户需求。