android的sqlite多线程 crash问题

工作发现sqlite在多线程中处理不好,经常crash。[[BR]]
写了个测试项目。
分别测试三种case: 直接使用,加锁,加引用。

并发1000个线程,做插入。

  • 1.直接使用,不加任何处理
    crash。完全没法用。08-06 12:07:04.323: E/AndroidRuntime(18482): java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
  • 2.使用锁
    执行正常,数据插入正常,没有sql句柄异常。结果OK。但是耗时26s.
  • 3.使用引用,无锁。
    起第758个线程时,crash.内存溢出。

改为并发100个线程,实际上客户端同一时间最好控制在20线程以内。

  • 1.直接使用,不加任何处理
    还是crash。完全没法用。{{{
    08-06 12:07:04.323: E/AndroidRuntime(18482): java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
    }}}
  • 2.使用锁
    执行正常,数据插入正常,没有sql句柄异常。结果OK。但是耗时2.2s.
  • 3.使用引用,无锁。
    执行正常,数据插入正常,没有sql句柄异常。结果OK。但是耗时1.0s.

结论:

实际使用中,用引用效率最高,考虑到实际线程不会太多,足够使用。[[BR]]
够严谨的话,得使用加锁。但由于资源竞争,效率会降低一半。 [[BR]]
一般项目建议使用加引用的方式。

demo地址

Tags: