2011-04-01 61 views
2


我写了一个java程序,应该用算法生成的某些行填充sqlite数据库。 所以我访问数据库,我插入我的行... 它去几秒钟,但:Java和SQLite问题

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

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

谢谢...

公共无效fillTable(字符串手)抛出异常
{
字符串数据= “”“ +手+”',0 ,0,0“;
if(count%100 == 0)
{
System.out.println((System.currentTimeMillis() - time)/(float)1000 +“s”+ count +“ - >”+ data );
time = System.currentTimeMillis(); (“+数据+”)“);”插入到手中(手,锁,完成,替换数)“VALUES(”+ data +“)”); http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC Xerial似乎往往比zentus多更新其驱动器:
}

+0

Hmmmm ...一些常见的罪魁祸首:这是螺纹的,如果是这样,你是积极的,你没有在同一时间访问从多个线程数据库? (请记住,GUI通常在与其他工作线程不同的线程中运行)是否每次都打开数据库,如果是这样,是否在尝试再次打开数据库之前关闭它?只是我遇到的一些事情。 – riwalk 2011-04-01 20:02:09

+0

这是什么操作系统?另一个程序是否可以同时触摸文件?你可能在分区上的磁盘空间不足吗? – 2011-04-01 20:02:17

+0

它是一个单线程程序,我在Windows七64,我使用zentus jdbc驱动程序,我有65GB的高清... – StefanoS 2011-04-01 20:11:13

回答

2

首先我使用的SQLite JDBC驱动程序从xerial.org它可以在这里找到了更好的运气。

使用jdbc时,最好使用PreparedStatements。准备好的陈述将允许你做一些事情,比如执行一批插入。而不是执行多个executeUpdate调用,您可以使用批次一次执行所有调用。有关批处理和PreparedStatements的示例,请参阅以下链接: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()时最终一次执行它们。

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

我希望这会有所帮助。

-Alex

+0

简单地切换到xerial jdbc驱动程序适用于我。谢谢! – duvo 2016-07-06 21:43:47