【问题标题】:Java and SQLite problemJava 和 SQLite 问题
【发布时间】:2011-04-01 19:57:29
【问题描述】:


我编写了一个 java 程序,它应该用算法生成的一些行填充 sqlite 数据库。 所以我访问数据库并插入我的行...... 它持续了几秒钟,但是:

1.30168691E9s 100 --> '0 1 2 5 8', 0, 0, 0
3.163s 200 --> '0 1 2 7 17', 0, 0, 0
3.158s 300 --> '0 1 2 9 30', 0, 0, 0
线程“主”java.sql.SQLException 中的异常:无法打开数据库文件
在 org.sqlite.DB.execute(DB.java:275)
在 org.sqlite.DB.executeUpdate(DB.java:281)
在 org.sqlite.Stmt.executeUpdate(Stmt.java:103)
在 grid0.GridFill.fillTable(GridFill.java:26)
在 grid0.GridFill.writeCombs(GridFill.java:54)
在 grid0.Main.main(Main.java:15)
Java 结果:1

程序运行前 300 行,但随后崩溃……我不明白为什么。 我需要一些帮助...

谢谢...

public void fillTable(String hand) 抛出异常
{
字符串数据 = "'" + 手 + "', 0, 0, 0";
if(count%100 == 0)
{
System.out.println((System.currentTimeMillis()-time)/(float)1000 + "s " + count +" --> " + data);
时间 = System.currentTimeMillis();
}
stat.executeUpdate("insert into Hands (Hand, Lock, Done, SubstitutionNumber) VALUES (" + data + ")");
}

【问题讨论】:

  • Hmmmm...一些常见的罪魁祸首:这是线程化的吗?如果是这样,您是否肯定不会同时从多个线程访问数据库? (请记住,GUI 通常在与其他工作线程不同的线程中运行)您是否每次都打开数据库,如果是,您是否在尝试再次打开之前关闭它?只是我遇到的一些事情。
  • 这是什么操作系统?是否有可能另一个程序同时触摸该文件?分区上的磁盘空间不足吗?
  • 它是一个单线程程序,我在 Windows 7 64 上,我使用的是 zentus jdbc 驱动程序,我在 HD 上有 65GB...

标签: java sql sqlite


【解决方案1】:

首先,我使用 xerial.org 的 sqlite jdbc 驱动程序获得了更好的运气,它可以在这里找到:http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC Xerial 似乎比 zentus 更频繁地更新驱动器。

使用 jdbc 时最好使用 PreparedStatements。准备好的语句将允许您执行诸如执行一批插入之类的操作。您可以使用批处理一次完成所有调用,而不是执行多个 executeUpdate 调用。有关批次和 PreparedStatement 的示例,请参见以下链接:http://download.oracle.com/javase/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html http://download.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/preparedstatement.html

您需要的基本代码示例是:

PreparedStatement stmt = con.prepareStatement(
    "INSERT INTO employees('salary', 'name') VALUES (?, ?)");

stmt.setInt(1, 2000);
stmt.setString(2, "Kelly Kaufmann");
stmt.addBatch();

stmt.setInt(1, 3000);
stmt.setString(2, "Bill Barnes");
stmt.addBatch();

// submit the batch for execution
stmt.executeBatch();

setInt(index, value) 允许您替换 '?'在 PreparedStatement 中带有一个值。使用批处理和准备好的语句,您可以多次执行此操作,并在最后调用 executeBatch() 时一次性执行它们。

正如评论者所说,确保在插入完成后关闭与数据库的连接。此外,您还需要关闭任何可能通过从数据库中选择打开的结果集。

我希望这会有所帮助。

-亚历克斯

【讨论】:

  • 简单地切换到 xerial jdbc 驱动程序对我有用。谢谢!
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2015-09-22
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多