我正在使用带有 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 init 方法中创建的连接。使用 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
我无法从数据库中读取多线程数据的假设是否正确?提前致谢。
最佳答案
你的 SQLite 版本已经过时了几年,但这个问题不太可能通过更好的查询优化器或启用 WAL mode 来解决。 .
SQLite 专为嵌入式应用程序而设计。 它使用单个数据库范围的锁;虽然这适用于并发访问,但它经过优化以加速非并发程序。
仅使用 SQLite is not appropriate for high-volume web sites . 使用一些设计为可扩展的数据库。
关于java - tomcat 服务器中的性能问题 Sqlite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25177767/