3 java mysql sql sql-server oracle
我有一些运行了很长时间(20-30分钟)的查询.如果同时启动大量查询,则会快速耗尽连接池.
是否有可能来包装长时间运行的查询到语句(程序),将通用的查询结果存储到一个临时表,terminanting连接,并fetchin(投票)结果以后的需求呢?
编辑:优化查询和数据结构,像"检查您的索引和执行计划"这样的提示对我不起作用.我正在寻找一种方法来存储通用结果集的[也许]字节表示,以便以后进行检索.
首先,20-30分钟是一个非常长的查询时间 - 你确定你没有错过查询的任何索引吗?检查您的执行计划 - 您可以通过良好的索引获得巨大的性能提升.
在MySQL中,你可以做到
INSERT INTO `cached_result_table` (
SELECT your_query_here
)
Run Code Online (Sandbox Code Playgroud)
(当然,cached_result_table需要具有与SELECT返回完全相同的列结构,否则您将收到错误).
然后,您可以查询这些缓存的结果(而不是原始表),并且只是不时运行上述查询 - 更新cached_result_table.
当然,查询最初需要至少运行一次,这需要你提到的20-30分钟.我建议在请求数据之前预先填充缓存表,并保留一些锁定机制以防止更新查询同时运行多次.伪代码:
init:
insert select your_big_query
work:
if your_big_query cached table is empty or nearing expiration:
refresh in the background:
check flag to see if there's another "refresh" process running
if yes
end // don't run two your_big_queries at the same time
else
set flag
re-run your_big_query, save to cached table
clear flag
serve data to clients always from cached table
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |