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&serverTimezone=UTC&useUnicode=true&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 页面实例发出另一个请求。用户可以向其他页面实例发出请求或创建新的页面实例!
如何解决问题?
- 更改 button/link #onClick() 回调方法以向 MySQL 发出异步请求,即在新线程中。这样 HTTP 处理线程可以继续并且 return 一个空的响应。
- 将数据库结果存储在某个临时位置,例如在内存中,在临时数据库中 table,...
- 数据可用后显示
- 一个简单的方法是使用
AbstractAjaxTimerBehavior
每隔几秒轮询一次数据库结果。一旦结果准备好,只需通过更新一些不可见的 Wicket 组件(如 DataTable)的模型来呈现它,并通过 AjaxRequestTarget#add(table)
显示它
- 尽快使用Wicket Native WebSocket发送数据库结果。这样就不需要临时存储结果。你甚至可以直播它
我有访问 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&serverTimezone=UTC&useUnicode=true&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 页面实例发出另一个请求。用户可以向其他页面实例发出请求或创建新的页面实例!
如何解决问题?
- 更改 button/link #onClick() 回调方法以向 MySQL 发出异步请求,即在新线程中。这样 HTTP 处理线程可以继续并且 return 一个空的响应。
- 将数据库结果存储在某个临时位置,例如在内存中,在临时数据库中 table,...
- 数据可用后显示
- 一个简单的方法是使用
AbstractAjaxTimerBehavior
每隔几秒轮询一次数据库结果。一旦结果准备好,只需通过更新一些不可见的 Wicket 组件(如 DataTable)的模型来呈现它,并通过AjaxRequestTarget#add(table)
显示它
- 尽快使用Wicket Native WebSocket发送数据库结果。这样就不需要临时存储结果。你甚至可以直播它
- 一个简单的方法是使用