2012-03-01 47 views
3

在hign并发环境中SQLite阻塞表丢失数据。我正在寻找提高SQLite的高性能并且不会丢失插入查询数据的方法。我的意图是知道用于插入的并发用户数限制,即网站在“高并发性”的情况下工作(在本例中为1插入请求)。为了使这个测试案例更简单,用户会发送数据到数据库Sqlite3插入性能测试

节省寻找如何提高性能和使用建议其他用户后:

  • sqlite.org
  • sqlite.org/的faq.html#Q19
  • stackoverflow.com/questions/1711631/how-do-i-improve-the-performance-of-sqlite
  • stackoverflow.com/questions/54998/how-scalable-is-sqlite

我决定在一个亚马逊小实例中做一个小测试。

平台

  • Linux版本的2.6.35.14-106.53.amzn1.i686([email protected])(gcc版本4.4.5 20110214(红帽4.4.5-6)( GCC))#1 SMP周五1月6日十六时20分23秒UTC 2012
  • SQLite的3.6.20
  • Lighttpd的1.4.29
  • 腓5.3.10

test.php with insert sql:

PRAGMA synchronous = OFF; BEGIN TRANSACTION; INSERT INTO testdata1date)VALUES('“。$ _ POST ['data1']。”',date()); END TRANSACTION;

使用Apache HTTP服务器基准测试工具。

数据库是文件系统中不在RAM中的文件。

结论: 测试1:AB -n 10000 -c 50 -k xxxx.xxx/test.php?data1=fc82bf71a0d5f8a3c2dc868ebe0d6eaa

  • 时间采取测试:63.637秒
  • 完成请求:10000
  • 失败请求:0
  • Sqlite插入行:10050
  • Average:159.52 insert/sg

Test2:ab -n 10000 -c 100 -k xxxx.xxx/test.php?DATA1 = fc82bf71a0d5f8a3c2dc868ebe0d6eaa

  • 时间采取的测试:64.221秒
  • 完成请求:10000名
  • 失败的请求:0
  • SQLite的插入的行:10100
  • 平均:157.26插入/ SG

Test3:ab -n 10000 -c 150 -k xxxx.xxx/test.php?data1=fc82bf71a0d 5f8a3c2dc868ebe0d6eaa

  • 时间采取测试:33.338秒
  • 完整的请求:10000名
  • 失败的请求:7095
  • (连接:0,接收:0,长度:7095,例外:0)
  • SQLITE:2905插入行
  • 平均值:丢失数据!

TEST4:AB -n采取测试10000〜C 200的-k xxxx.xxx/test.php?data1=fc82bf71a0d5f8a3c2dc868ebe0d6eaa

  • 时间:33.705秒
  • 完成请求:万名
  • 失败的请求:7049
  • (连接:0,接收:0,长度:7049,例外:0)
  • SQLITE:2918插入行
  • 平均:丢失数据!

在这个特定的环境中,我们可以使用SQLite最多100个并发用户,平均值为157.26 insert/sg。考虑到这个结果只适用于插入数据。

从我的无知,有可能防止丢失数据?是否有可能改善这种表现?

+0

我喜欢SQLite的,但你真的不打自己的优势......为什么不记录到文件中,然后定期导入that've对于SQLite – Eli 2012-04-15 05:42:10

+0

我们正在使用sqlite3的生产与基于Web的约20个用户Rails应用程序(并非全部都在同一时间在线)。到目前为止,我们还没有听到投诉。现在我们正在开发一个拥有大约60个用户的Web应用程序,我们想知道是否需要使用其他数据库,如postgres或mysql。您发布帮助以了解sqlite3的限制和100个并发用户对我们的应用程序看起来不错。你是否尝试从多台电脑或更大的数据集插入启动插入? Sqlite3使用非常简单,我们喜欢它。 – user938363 2012-10-16 15:35:44

+0

c = 100和150之间是否有c测试没有丢失数据? – user938363 2012-10-16 17:48:23

回答

2

我认为Sqlite3不应该在你的情况下使用。是的,sqlite3是处理并发性很好的嵌入式数据库之一,但为了扩展并提高性能,我建议仅使用服务器/客户端数据库。

让我们看看你最近的测试,你在大约30秒内发出10000个请求。如果他们平均分配,Sqlite3将不允许每个事务需要超过3ms(请记住,sqlite3一次只允许一个写入过程)。我们来看看sqlite文档。 (http://www.sqlite.org/faq.html

我们都知道,作为支持多 作为并发的SQLite没有其他嵌入式SQL数据库引擎的。 SQLite允许多个进程一次打开数据库文件,并允许多个进程一次读取数据库 。当任何进程想要写入时,它必须在整个数据库文件更新期间锁定整个数据库文件。但通常 只需要几毫秒。

总结:只是锁定数据库需要几毫秒,而不是说更新本身。

然而,客户机/服务器数据库引擎(如PostgreSQL的,MySQL和或 甲骨文)通常支持并发的更高水平,并允许 多个进程在同一 时间被写入到相同的数据库。这在客户端/服务器数据库中是可能的,因为总是有一个良好控制的服务器进程可用来协调 访问。如果您的应用程序需要很多并发性,那么您应该考虑使用客户机/服务器数据库。但是经验 表明,大多数应用程序所需要的并发性比设计者想象的要少得多。

您有几种可能性:

  • 变化的方式您的应用程序工作。你不太可能需要那么多的并发。
  • 如果您仍然坚持需要并发性和良好稳定的性能,请切换到客户端/服务器数据库。
  • 接受某些请求在您的负载达到峰值时失败。