java - 使用 JDBC 对 MySQL 进行低优先级更新——如何检查它们是否有效

标签 java mysql spring jdbc

我有一个基本设置,其中数据库由多个 Web 应用程序读取,并且我定期有一个批处理应用程序进行大量写入。在编写过程中,web 应用程序的性能严重下降(它们的数据库读取非常慢)。

环境。是使用 MYISAM 引擎的 MySQL 数据库,批处理应用程序是一个 Java SE 应用程序,使用 spring-batch 和 SimpleJDBCTemplate 通过 JDBC 发出 SQL 命令。我发现 MySQL 有一个参数可以降低 MYISAM 引擎上写操作的优先级:low_priority_updates .要引用文档,除其他外,您可以“设置 LOW_PRIORITY_UPDATES=1 以更改一个线程中的优先级”。我选择这个是因为从我的应用程序的配置角度来看它是最简单的。我所做的是配置我的数据源,以便它为它打开的每个连接执行“SET ...”,如下所示:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!-- other props omitted -->
        <property name="connectionInitSqls">
            <list>
                <value>SET low_priority_updates="ON"</value>
            </list>
        </property>
    </bean>

现在我的问题是,我如何实际检查通过此数据源发出的 SQL 是否确实以低优先级运行?如果我在 MySQL 中执行 SHOW FULL PROCESSLIST 而插入正在发生,它只会告诉我他们正在执行什么 SQL,与优先级无关:

enter image description here

如果我检查服务器变量 low_priority_updates 为“OFF”,但那只是服务器变量,它与线程本地值无关。

那么,是否有任何实际的方法来检查是否考虑了每个查询/线程的 low_priority_updates 值?

最佳答案

通过发出 SET LOW_PRIORITY_UPDATES=1 命令,您正在影响 session 的变量值。因此,可以通过检查 session 中变量的值来查看这一点。

我知道有两种方法可以做到这一点:

1- 显示像“low_priority_dapdates”这样的 session 变量

这显示开/关

2- 选择@@session.low_priority_updates

这给出 0/1

重要提示:上述语句/调用将向您显示变量在它们运行的​​ session 中的值。 因此,您将需要使用连接本身来运行它们以查看值。我不知道 MySQL 中有什么方法可以为属于另一个 session 的变量选择值。

如果您希望以列表的形式查看它们,您可能需要通过创建一个表并自己记录该信息来解决问题。例如:

CREATE TABLE `mydb`.`my_low_priority_updates` (
  `connection_id` INT ,
  `low_priority_updates_value` INT  NOT NULL
)
ENGINE = MyISAM;

然后您需要一个语句将连接 ID 和值插入到表中:

insert into my_low_priority_updates(connection_id,low_priority_updates_value)
select connection_id(),@@session.low_priority_updates
from dual
where not exists (select 1 from my_low_priority_updates where connection_id=connection_id())

您可以将此语句放在一个过程中并确保它被调用,或者将它添加到您知道已更新/插入到的表的触发器中。

之后,稍后查询 my_low_priority_updates 表将显示每个连接中变量的值。

关于java - 使用 JDBC 对 MySQL 进行低优先级更新——如何检查它们是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8039201/

相关文章:

java - 如何在Java中提取包含多个括号的子字符串?

java - 绕过 JPA/Hibernate 缓存并命中数据库

mysql - MySQL中多个表的总分总和

java - Hibernate 不会级联实体保存

java - NoClassDefFoundError - 动态加载类路径类依赖项在 URLClassLoader 中加载

java - 如何删除控制台中的所有字符?

MySQL 抛出错误 1064,似乎无法识别 OVER 命令

php - 安卓 : send json data to the Server

Java 局部变量与全局字段 - 性能

java - Spring 测试MVC : Testing controller that redirects to another controller