【问题标题】:MySQL and Wicket: perform multiple queries parallelMySQL 和 Wicket:并行执行多个查询
【发布时间】:2021-01-19 13:17:14
【问题描述】:

我有访问 MySQL (5.7) 数据库的 Wicket (8.6) 应用程序。在spring-context.xml中建立mysql连接如下:

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
    destroy-method="close">
    <property name="dataSourceClassName" value="com.mysql.cj.jdbc.MysqlDataSource" />
    <property name="maximumPoolSize" value="5" />
    <property name="maxLifetime" value="90000" />
    <property name="idleTimeout" value="90000" />
    <property name="connectionTimeout" value="90000" />
    <property name="dataSourceProperties">
        <props>
            <prop key="url">jdbc:mysql://${db.url}/${db.name}?useGmtMillisForDatetimes=true&amp;serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8</prop>
            <prop key="user">${db.username}</prop>
            <prop key="password">${db.password}</prop>
            <prop key="prepStmtCacheSize">250</prop>
            <prop key="prepStmtCacheSqlLimit">2048</prop>
            <prop key="cachePrepStmts">true</prop>
            <prop key="useServerPrepStmts">true</prop>
        </props>
    </property>
</bean>

我有一个问题,我需要执行一个很长的 SQL 查询,根据所选的时间范围,这很容易需要几分钟。我已经体验到,在执行查询时,整个检票口应用程序减慢到一定程度,不再执行其他查询。顺便说一句:长查询只是一个阅读查询。所以它不应该锁定一个表。
如果有人可以帮助我改善 wicket 和 mysql 之间的连接,我将不胜感激,以便在执行长查询时我仍然可以运行多个查询。 MySQL的配置我不是很熟悉

以下是 my.cnf 文件中的一些设置:

skip-external-locking
innodb_file_per_table   = 1
innodb_file_format = Barracuda
internal_tmp_disk_storage_engine=MyISAM
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8
query_cache_limit   = 1M
query_cache_size        = 16M

【问题讨论】:

  • 创建另一个到 mysql 的连接并将其用于短期运行的 sql 语句。
  • 附加信息请求。 RAM 大小、# 核心、MySQL 主机服务器上的任何 SSD 或 NVME 设备?在 pastebin.com 上发布并分享链接。从您的 SSH 登录根目录中,文本结果为:B) SHOW GLOBAL STATUS;至少 24 小时正常运行时间后 C) 显示全局变量; D) 显示完整的处理程序; E) 状态;和 可选的非常有用的信息,如果可用,包括 - htop 或 top 用于大多数活动应用程序,ulimit -a 用于 Linux/Unix 限制列表,iostat -xm 5 3 用于按设备和核心/cpu 计数的 IOPS,用于服务器工作负载调整分析提供建议。

标签: mysql wicket


【解决方案1】:

您遇到的问题是在SQL Select 操作的长时间内保持HTTP 连接。

Wicket 最多允许向 Page 实例发出一个请求。 IE。一旦您单击按钮/链接Get data,它将向特定页面实例(由 url 中的页面 id 参数标识,?123&amp;...)发出 HTTP 请求,并且在 SQL 操作返回之前,用户无法向相同页面实例。用户可以向其他页面实例发出请求或创建新的实例!

如何解决问题?

  1. 更改按钮/链接 #onClick() 回调方法以向 MySQL 发出异步请求,即在新线程中。这样,HTTP 处理线程可以继续并返回空响应。
  2. 将 DB 结果存储在某个临时位置,例如在内存中,在临时数据库表中,...
  3. 一旦数据可用就显示数据
    • 一种简单的方法是使用AbstractAjaxTimerBehavior 每隔几秒轮询一次数据库结果。一旦结果准备就绪,只需通过更新一些不可见的 Wicket 组件(如 DataTable)的模型来呈现它,并通过 AjaxRequestTarget#add(table) 显示它
    • 使用 Wicket Native WebSocket 尽快发送 DB 结果。这样就不需要临时存储结果。您甚至可以流式传输它

【讨论】:

    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多