MySQL 和 Wicket:并行执行多个查询

MySQL and Wicket: perform multiple queries parallel

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

<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 应用程序会减慢到这一点,不再执行其他查询。顺便说一句:长查询只是一个阅读查询。所以它不应该锁定 table.
如果有人可以帮助我改进 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

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

Wicket 最多允许对 Page 实例进行一次请求。 IE。单击 button/link Get data 后,它将向特定页面实例发出 HTTP 请求(由 url、?123&... 中的页面 id 参数标识),直到 SQL 操作 returns 用户不能向 same 页面实例发出另一个请求。用户可以向其他页面实例发出请求或创建新的页面实例!

如何解决问题?

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