ActiveMQ中使用mysql做持久化报错:Cannot execute statement: impossible to write to binary log since BINLOG_FORM

ActiveMQ中如果使用mysql innodb的同时,开启了binlog,那么在ack消息的时候,日志里就可会报错:java.sql.SQLException: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-logging.
InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.

这是因为,mysql默认的binlog_format是STATEMENT,而在READ COMMITTED或READ UNCOMMITTED隔离级别下,innodb只能使用的binlog_format是ROW。

而在ActiveMQ的store JDBC实现中(TransactionContext),为了提高并发性能,使用的是READ UNCOMMITTED:

[java] view plaincopyprint?

  1. // a cheap dirty level that we can live with
  2. private int transactionIsolation = Connection.TRANSACTION_READ_UNCOMMITTED;
     // a cheap dirty level that we can live with
     private int transactionIsolation = Connection.TRANSACTION_READ_UNCOMMITTED;

所以,就会出现上面的问题。

解决办法有两个:

1、在mysql里设置binlog_format为ROW,此时binlog会增大,但是一般来说对数据复制支持的更好,建议单机高性能环境下使用。

2、在activemq.xml的jdbcPersistenceAdapter里配置transactionIsolation=“4”,即TRANSACTION_REPEATABLE_READ,此时事务更严格,会影响性能,建议在集群、强实时一致、不强调单机性能的情况下使用。

可以参见源码里的说明:

[java] view plaincopyprint?

  1. /**
  2. * set the Transaction isolation level to something other that TRANSACTION_READ_UNCOMMITTED
  3. * This allowable dirty isolation level may not be achievable in clustered DB environments
  4. * so a more restrictive and expensive option may be needed like TRANSACTION_REPEATABLE_READ
  5. * see isolation level constants in {@link java.sql.Connection}
  6. * @param transactionIsolation the isolation level to use
  7. */
  8. public void setTransactionIsolation(int transactionIsolation) {
  9. this.transactionIsolation = transactionIsolation;
  10. }
时间: 2024-08-11 05:38:00

ActiveMQ中使用mysql做持久化报错:Cannot execute statement: impossible to write to binary log since BINLOG_FORM的相关文章

JAVA调用mysql数据操作时出现错误:impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.'

使用mysql做持久化报错:Cannot execute statement: impossible to write to binary log since BINLOG_FORM ActiveMQ中如果使用mysql innodb的同时,开启了binlog,那么在ack消息的时候,日志里就可会报错:java.sql.SQLException: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATE

MySQL中遇到的几种报错及其解决方法

MySQL中遇到的几种报错及其解决方法 1.[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''xxx'' at line 1 解决方法:将所有的" '' "换成" ·· "(将所有的英文单引号换为Tab键上面的那个点号)

window下用主机名登录MySQL数据库出现报错解决方案

分享一个工作中的小案例:windows主机上用SQLyog使用主机名登录MySQL数据库(Linux系统上搭建),结果报错,因为经常在windows上使用主机名互相访问资源.远程登录等.以为Linux上应该也可以,所以就开始研究.通过查找资料及多方帮助终于解决并搞清楚原因.希望大家不要重蹈覆辙. 故障:在windows服务器上使用主机名登录MySQL出现以下报错,主机名"test-aa-shop1" ping不通,但是对应的IP可以ping通. 故障分析:windows之间可以用主机名

Xtrabackup恢复mysql数据时候报错:Original data directory is not empty!

使用Xtrabackup恢复mysql数据时候报错:Original data directory is not empty! at /usr/bin/innobackupex line 568. 网上普遍只说了引起这种想象的两种原因,还有第三种原因是我遇到的: 1.恢复备份文件要保证mysql的data目录为空,否则会报错,解决办法:  # /etc/init.d/mysqld stop # cd /usr/local/mysql # cp -rf data{,.bak} # rm -rf .

mysql故障:重启mysql后启动报错

昨天在试运行环境做系统升级,突然间SSH连接断开,尝试进行连接一直报错,后来重启我的电脑再次进行连接,依然报错,奇怪的测试人员访问公司的liferay界面可以正常访问,后来给部门同事打电话问他们今天有没有对试运行环境做过什么修改,两个同事都说是今天没有对试运行服务器做过任何操作,我自己也没有做过什么操作,后来跟机房的技术支持打电话咨询了一下,技术支持说机房今天也没有做什么操作更没有做什么限制,后来通过登录Xenserver来登录到试运行这台机器,发现没有异常,还特意看了一下SSH的连接数,查看l

远程连接mysql root账号报错:2003-can't connect to MYSQL serve

1.远程连接Linux系统,登录数据库:mysql -uroot -p(密码) 2.修改root账号的设置: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; 其中'root'为mysql用户名,'123456'为root账户密码,修改其他用户修改对应的参数即可. 3.执行 flush privileges;命令立即生效 4. 使用exit命令退出MySQL 然后打开vim  /

sharepoint 2013中infopath使用GetUserProfileByName一直报错5566解决方案

最近折磨了很久的sharepoint关于infopath 表单调用数据库中的GetUserProfileByName数据总是报错5566.至少弄了2个月.现在把sharepoint 203的配置方法写一遍出来.分享给大家. 1:安装infopath ,在开始菜单里面找到office 2013 选择 infopath designer 2013. 第一步:用SharePoint表单库模板新建一个InfoPath表单 第二步:为UserProfileService建立数据连接 在功能区中选择数据连接

mysql 存储 emoji报错( Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F)的解决方案

1.报错原因: mysql utf-8 编码储存的是 2-3个的字节,而emoji则是4个字节. 2.解决办法: 修改mysql的配置文件,windows下的为my.ini(linux下的为my.cnf),修改的内容都一样. [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server

【ActiveMQ】消息生产者自动注入报错:Could not autowire. No beans of 'JmsMessagingTemplate' type found

使用ActiveMQ过程中,定义消息生产者: package com.sxd.jms.producer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service; import javax.jms.Destination;