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

如何解决MySQL 和 Wicket:并行执行多个查询

我有访问 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 应用程序会减慢到这一点,不再执行其他查询。顺便说一句:长查询只是一个阅读查询。所以它不应该锁定一个表。
如果有人能帮助我改进 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。单击按钮/链接 Get data 后,它将向特定页面实例(由 url 中的页面 ID 参数 ?123&... 标识)发出 HTTP 请求,并且直到 SQL 操作返回用户无法发出对相同页面实例的另一个请求。用户可以向其他页面实例发出请求或创建新的页面实例!

如何解决问题?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?