android的sqlite多线程 crash问题
2014 年 8 月 5 日
工作发现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]]
一般项目建议使用加引用的方式。