【发布时间】:2014-09-30 09:57:00
【问题描述】:
我正在使用带有 Xerial sqlite-jdbc-3.7.15-M1.jar 驱动程序的 Tomcat 6。 SQLite3 的版本是 3.6.20。
如果服务器负载不足,处理请求需要难以置信的时间。通常一个请求需要少于 100 毫秒。在负载下,它最多上升 3 秒。
很长一段时间我都不知道发生了什么。从昨天开始,我相信 Sqlite 会阻止读取访问。我可以通过读取 ResultSet 看到很多线程正在阻塞。
"http-8080-34" daemon prio=10 tid=0x00007ffca0049800 nid=0x78b2 waiting for monitor entry [0x00007ffcbc5e0000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.sqlite.NativeDB.column_text(Native Method)
- waiting to lock <0x00000000f8836508> (a org.sqlite.NativeDB)
at org.sqlite.RS.getString(RS.java:562)
at org.sqlite.RS.getString(RS.java:569)
首先我尝试了一个内存数据库,然后是共享缓存。两种解决方案都存在连接需要创建打开标志才能将表从硬盘复制到内存的问题。
从昨天开始,我只想从硬盘读取访问权限,但我看不到描述结果的变化。它寻找我的序列化。
我正在使用一个在 Servlet 初始化方法中创建的连接。有了 NOMUTEX 标志,我想我可以在运行时激活多线程。
SQLiteConfig config = new SQLiteConfig();
config.setReadOnly(true);
config.setSharedCache(true);
config.setReadUncommited(true);
config.setOpenMode(SQLiteOpenMode.NOMUTEX);
connection = config.createConnection("jdbc:sqlite:" + file.getAbsolutePath());
config.apply(connection);
如果我没有大的误解,我的结果是我不能在多线程环境中使用 Sqlite,比如默认使用 200 个 maxThreads 的 Tomcat 服务器。
在我的研究工作中,我也在使用 sqlite4java,这里使用了一个队列。有了这个驱动程序,我可以确定 SELECT 请求是按顺序处理的。
这里是sqlite的编译结果:
java -jar sqlite4java.jar
sqlite4java 282
SQLite 3.7.10
Compile-time options: ENABLE_COLUMN_METADATA ENABLE_FTS3 ENABLE_FTS3_PARENTHESIS
ENABLE_MEMORY_MANAGEMENT ENABLE_RTREE OMIT_DEPRECATED TEMP_STORE=1 THREADSAFE=1
我无法从数据库中多线程读取数据的假设是否正确?提前致谢。
【问题讨论】:
标签: java multithreading sqlite tomcat query-performance