我正在提供由 servlet 提供的 RESTful 服务(在 Tomcat 7.0.X 和 Ubuntu Linux 中运行)。我每小时已经收到大约 20,000 个查询,而且还会增长得更高。servlet 接收请求,准备响应,在 MySQL 数据库表中插入记录并传递响应。数据库中的日志是绝对强制性的。直到最近,所有这一切都以同步的方式发生。我的意思是,在 Tomcat 线程传递响应之前,它必须在数据库表中创建记录。问题是这个日志过去占用了总时间的 90% 以上,甚至更糟:当数据库变慢时,服务大约需要 10-15 秒而不是 20 毫秒。
我最近做了一个改进:每个 Tomcat 线程都会创建一个额外的线程来执行“(new Thread(new certain Object)).start();” 它以异步方式处理 SQL 插入,因此响应更快地到达客户端。但是当 MySQL 运行速度较慢并且线程成倍增加时,这些线程占用了太多 RAM,而 JVM Tomcat 运行的内存有数千个。
我需要的是能够接受尽可能多的 HTTP 请求,尽可能快地记录每个请求(不同步),并在 MySQL 变慢并插入时使一切都变得快速并且 RAM 使用率非常低需要排队。当http请求的速度高于数据库日志中的插入速度时,我想我需要某种队列来缓冲条目。
我正在考虑这些想法:
1-自己创建某种 FIFO 队列,可能使用一些 Apache 公共集合,以及轮询集合并创建数据库记录的某种线程。但是我应该使用什么集合?我应该如何对轮询它的线程进行编程,这样它就不会独占 CPU?我认为“Do while (true)....”会占用 CPU 周期。那是关于让它线程安全的吗?怎么做?我认为自己做这件事太费力了,很可能我会重新发明轮子。
2-log4J?我从未直接使用过它,但似乎这个框架的算法旨在创建与数据库对话的“附加程序”。那会是这样做的方法吗?
3-使用某种专门从事此工作的任何其他框架?
你有什么建议?
提前致谢!