我有一个基于 Play Framework 2.3 (scala) 的简单 Web 应用程序,它目前使用 sqlite3 作为数据库。我有时但并非总是会因将行插入数据库而导致异常:
java.sql.SQLException: statement is not executing
at org.sqlite.Stmt.checkOpen(Stmt.java:49) ~[sqlite-jdbc-3.7.2.jar:na]
at org.sqlite.PrepStmt.executeQuery(PrepStmt.java:70) ~[sqlite-jdbc-3.7.2.jar:na]
...
问题出现在几个不同的上下文中,都源自 SQL(statement).executeInsert()
例如:
val statementStr = "insert into session_record (condition_id, participant_id, client_timestamp, server_timestamp) values (%d,'%s',%d,%d)".format(conditionId,participantId,clientTime,serverTime)
DB.withConnection( implicit c => {
val ps = SQL(statement)
val pKey = populatedStatement.executeInsert()
// ...
}
当没有抛出异常时,pKey 包含一个带有表的自动递增主键的选项。当抛出异常时,数据库的状态表明基本语句已执行,如果我将记录的 SQL 语句手动尝试一下,它也可以毫无问题地执行。
不使用“executeInsert”执行的插入语句也可以工作。此时,我可以只使用“.execute()”并单独获取最大主键,但我担心可能会遗漏一些更深层次的问题。
一些配置细节:
在 application.conf 中:
db.default.driver=org.sqlite.JDBC
db.default.url="jdbc:sqlite:database/mySqliteDb.db"
我的 sqlite 版本是 3.7.13 2012-07-17
我使用的 JDBC 驱动程序是“org.xerial”%“sqlite-jdbc”%“3.7.2”(通过 build.sbt)。