我正在编写一个使用本地SQL数据库存储数据的程序。
我正在使用在这里找到的驱动程序:https :
//bitbucket.org/xerial/sqlite-jdbc
我试图从数据库中读取并将tableName的内容放入这样的JTable中:
public Object[][] getTable(String tableName){
int columns = getColumnNumber(tableName);
int rows = getRowNumber(tableName);
String[] columnNames = getColumnNames(tableName);
Object[][] table = new Object[rows][columns];
try{
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db");
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("select * from " + tableName);
for(int r = 0; r < rows; r++){
rs.next();
for (int c = 0; c < columns; c++){
table[r][c] = rs.getString(columnNames[c]);
}
}
return table;
}catch(Exception e){
System.out.println("ERROR CREATING TABLE ARRAY");
e.printStackTrace();
return null;
}
}
然后,稍后我尝试返回并向表中添加一行:
public boolean addRow(String tableName, Object[] values){
if(!isDataAcceptable(tableName, values))
return false;
try{
String stmt = "insert into " + tableName + " values (";
for(int c = 0; c < values.length; c++){
if(values[c] instanceof String)
stmt += "'" + values[c] + "'";
else
stmt += values[c];
if(c == (values.length - 1))
stmt += ");";
else
stmt += ", ";
}
System.out.println(stmt);
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db");
Statement statement = connection.createStatement();
statement.executeUpdate(stmt);
return true;
}catch(Exception e){
System.out.println("ERROR INSERTING ROW");
e.printStackTrace();
return false;
}
}
然后,我想用新行更新之前创建的JTable。
但是,当我尝试添加行时会导致异常:
java.sql.SQLException: database is locked
指向这一行:
statement.executeUpdate(stmt);
…在addRow()方法中。
为什么数据库被锁定?如何解锁数据库才能写入数据库?
为什么数据库被锁定?如何解锁数据库才能写入数据库?
该数据库很可能已锁定,addRow
因为上一次调用getTable
并未关闭结果集。该代码还无法关闭数据库连接对象,这将导致资源泄漏。
基本的解决方法是调用close()
在rs
和connection
对象,但你需要做的是正确的方法,使你的代码可靠。
这是在Java 7中使用“尝试使用资源”语法的推荐方法:
try (Connection connection =
DriverManager.getConnection("jdbc:sqlite:" + dbName + ".db"),
Statement stmt = connection.createStatement(),
ResultSet rs = stmt.executeQuery("select * from " + tableName)) {
for (int r = 0; r < rows; r++) {
rs.next();
for (int c = 0; c < columns; c++++) {
table[r][c] = rs.getString(columnNames[c]);
}
}
return table;
} catch (Exception e) {
System.out.println("ERROR CREATING TABLE ARRAY");
e.printStackTrace();
return null;
}
您也可以通过close
在一个finally
块中显式调用来执行此操作,但这更加冗长,并且如果您有需要关闭的相关资源,则代码可能很难正确使用…像这里一样。
问题内容: 我在golang中使用sqlite3数据库,但出现错误:“数据库已锁定”。 我知道使用同一数据库文件不能有多个线程。 尽管我的程序中只有一个连接并关闭了所有查询结果,但是它始终会创建2或3个数据库文件的句柄。 我通过使用opendfileview程序对它进行了云检查。 任何人都可以帮助我解决这个问题。提前致谢。 以下代码创建两个数据库文件句柄。 问题答案: 尝试延迟:
Im得到一个数据库被锁定(代码5)在我的ListActive中,代码在其他版本的模拟器中工作,但在4.1版本的模拟器中失败 E/SQLiteLog(2132):(5)数据库被锁定E/SQLiteDatabase(2132):无法打开数据库“/data/data/id.online。mydroid/databases/geo。db’。E/SQLiteDatabase(2132):android。数据
我能找到的关于和是由显示的: 最大的问题是:在复制/转储之前,这两个命令是否都会锁定数据库?备份是否一致? 这个答案有一些关于,但是有权威的留档吗?(那么呢?)我能在SQLite的留档中找到的唯一东西是“在线备份应用编程接口”,但我对应用编程接口不感兴趣,我只想备份数据库。
问题内容: 我在我的应用程序中做了一些重复的操作(测试),突然我收到一个奇怪的错误: 我已经重新启动服务器,但是错误仍然存在。可能是什么呢? 问题答案: 从Django文档中: SQLite是一个轻量级的数据库,因此不支持高级别的并发性。OperationalError:数据库已锁定错误,表明你的应用程序并发性超过sqlite在默认配置下无法处理的并发性。此错误意味着一个线程或进程在数据库连接
我有片段,我在每个片段中缓存数据。我将数据缓存在AsyncTask中,方法是从服务器上以doInBackground方法下载数据,并将其保存在onPostExecute中到我的数据库中。因此,我总是在onPostExecution中打开数据库连接。如果我滚动“fast”并抛出片段,我认为AsyncTasks会传递预览实例,并且在我打开连接的行中会出现一个<code>android.database
问题内容: 我的Java程序想要读取一个文件,该文件可以被另一个写入该文件的程序锁定。我需要检查文件是否已锁定,如果已锁定,请等待它释放。我该如何实现? Java程序在Windows 2000服务器上运行。 问题答案: 在带有Sun JVM的Windows下,尽管JavaDoc保留了相当模糊的可靠性(取决于系统),但FileLocks应该可以正常工作。 但是,如果您只需要在Java程序中识别出 其