我刚从命令行创建了一个新的SQLite数据库,并且我与SQLite数据库建立了ODBC连接 如果我发出查询,默认情况下,同步似乎是“开启”,这实际上是在缓慢降低INSERT性能。
如何让SQLite数据库默认为 PRAGMA synchronous = OFF
,而无需为此发送SQL命令?我可以创建一个.INI文件或其他东西来启用吗?
答案 0 :(得分:10)
不幸的是,对于每个人,在让这个问题停留6天之后,我终于找到了答案。 SQLite ODBC driver似乎就是答案。如果您创建DSN,则可以在DSN设置中将“同步”设置为“关闭”。非常方便。
答案 1 :(得分:4)
默认情况下,SQLite在FULL同步上运行。没有INI,除了连接时没有任何改变。但是,每次会话只需设置一次,因此您可以更改项目的连接功能,以便在连接后添加“PRAGMA synchronous = OFF”命令。这实际上是最干净,最快捷的方法。
但是如果您确实希望SQLite在默认情况下关闭同步打开数据库,您可能希望使用不同的默认值重新编译SQLite。
对于当前版本(3.7.3),在sqlite-amalgamation source的sqlite.c中查找变量safety_level
:
变化:
safety_level = 3;
要:
safety_level = 1;
(是的,它是shell设置中的一个。)在openDatabase
函数中(如果您愿意,可以attachFunc
。)
如果你确实需要加速这个过程,正如评论中所述,你至少会考虑交易。在路上,这是首选的解决方案。它可能不是最简单的,也可能是最可能的(时间毕竟仅限于所有),但从长远来看,它是最干净,最安全,最容易维护的。 (我只是不得不放弃我的胸膛。完成!)
答案 2 :(得分:2)
在Java中,我在getConnection方法上使用以下代码段。所以每当我获得新连接时,同步都将被禁用。
Connection con = DriverManager.getConnection("jdbc:sqlite:lms.db");
Statement st = con.createStatement();
String sql="PRAGMA synchronous=OFF";
st.execute(sql);
答案 3 :(得分:0)
距离该主题的最后一个答案已经有很长时间了,但是如果像我这样的人正在寻找一种设置“ PRAGMAynchronous = OFF”但无法保持SQLite连接存活的方法(我有我的理由);我所做的是在查询开始时设置“ PRAGMA syncon = OFF”,然后进行常规操作,然后以分号(;)分隔,如下所示:
PRAGMA synchronous = OFF; INSERT INTO [...]
不知道这是否是最佳做法,但这对我有用。
答案 4 :(得分:0)
无论如何,在 Windows 中,PRAGMA 语句必须在打开数据库之后执行,而不是之前。