Shi*_*gon 6 java mysql spring jdbc
我有一个基本设置,其中数据库由多个Web应用程序读取,并且我有一个批处理应用程序,它做了大量的写作.在编写过程中,Web应用程序的性能严重下降(其数据库读取速度非常慢).
环境 是使用MYISAM引擎的MySQL数据库,批处理应用程序是一个Java SE应用程序,使用spring-batch和SimpleJDBCTemplate通过JDBC发出SQL命令.我发现,MySQL有,降低对MyISAM引擎的写入操作的优先级参数:LOW_PRIORITY_UPDATES.要引用文档,除其他外,您可以"设置LOW_PRIORITY_UPDATES = 1来更改一个线程中的优先级".我选择了这个,因为从我的应用程序的配置角度来看它是最容易的.我所做的是配置我的DataSource,以便为它打开的每个连接执行"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>
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,我如何实际检查通过此数据源发出的SQL是否确实以低优先级运行?如果我SHOW FULL PROCESSLIST在插件发生时在MySQL中执行它只是告诉我他们正在执行什么SQL,没有关于优先级:

如果我检查服务器变量low_priority_updates是"OFF"但这只是服务器变量,那么它与线程本地值无关.
那么,是否有任何实际的方法来检查每个查询/线程low_priority_updates的值是否被考虑在内?
小智 1
通过发出 SET LOW_PRIORITY_UPDATES=1 命令,您将影响会话的变量值。因此,可以通过检查会话中变量的值来看到这一点。
我知道有两种方法可以做到这一点:
1-显示像“low_priority_dapdates”这样的会话变量
这显示开/关
2-选择@@session.low_priority_updates
这给出 0/1
重要提示:上面的语句/调用将向您显示它们运行的会话中变量的值。因此,您需要使用连接本身来运行它们才能查看值。我不知道 MySQL 中有什么方法可以为属于另一个会话的变量选择值。
如果您想以列表的形式查看它们,您可能需要通过创建一个表并自己记录该信息来解决此问题。例如:
CREATE TABLE `mydb`.`my_low_priority_updates` (
`connection_id` INT ,
`low_priority_updates_value` INT NOT NULL
)
ENGINE = MyISAM;
Run Code Online (Sandbox Code Playgroud)
那么您需要一条将连接 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())
Run Code Online (Sandbox Code Playgroud)
您可以将此语句放入过程中并确保其被调用,或者将其添加到您知道已更新/插入的表上的触发器中。
之后,稍后查询 my_low_priority_updates 表将显示每个连接中变量的值。