博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Connection is read-only. Queries leading to data modification are not allowed
阅读量:6858 次
发布时间:2019-06-26

本文共 1873 字,大约阅读时间需要 6 分钟。

看了下mysql-connector-5.1.40版本中,如果设置failoverReadOnly=true (即默认值,参考 ),当mysql连接failover时,会根据jdbc连接串将当前连接的readOnly值设置为true (第8行代码)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private 
synchronized 
void 
switchCurrentConnectionTo(
int 
hostIndex, MySQLConnection connection) 
throws 
SQLException {
    
invalidateCurrentConnection();
 
    
boolean 
readOnly;
    
if 
(isPrimaryHostIndex(hostIndex)) {
        
readOnly = 
this
.explicitlyReadOnly == 
null 
false 
this
.explicitlyReadOnly;
    
else 
if 
(
this
.failoverReadOnly) {
        
readOnly = 
true
;
    
else 
if 
(
this
.explicitlyReadOnly != 
null
) {
        
readOnly = 
this
.explicitlyReadOnly;
    
else 
if 
(
this
.currentConnection != 
null
) {
        
readOnly = 
this
.currentConnection.isReadOnly();
    
else 
{
        
readOnly = 
false
;
    
}
    
syncSessionState(
this
.currentConnection, connection, readOnly);
    
this
.currentConnection = connection;
    
this
.currentHostIndex = hostIndex;
}
  当执行update操作时,如果检测到readonly,就会跑出createSQLException (第8-9行代码)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected 
int 
executeUpdate(
byte
[][] batchedParameterStrings, InputStream[] batchedParameterStreams, 
boolean
[] batchedIsStream, 
int
[] batchedStreamLengths,
        
boolean
[] batchedIsNull, 
boolean 
isReallyBatch) 
throws 
SQLException {
 
    
synchronized 
(checkClosed().getConnectionMutex()) {
 
        
MySQLConnection locallyScopedConn = 
this
.connection;
 
        
if 
(locallyScopedConn.isReadOnly()) {
            
throw 
SQLError.createSQLException(Messages.getString(
"PreparedStatement.34"
) + Messages.getString(
"PreparedStatement.35"
),
                    
SQLError.SQL_STATE_ILLEGAL_ARGUMENT, getExceptionInterceptor());
        
}
 
        
....
    
}
}

  上述报错信息是PreparedStatement.34和PreparedStatement.35,查mysql connector的LocalizedErrorMessages.properties

1
2
PreparedStatement.
34
=Connection is read-only.
PreparedStatement.
35
=Queries leading to data modification are not allowed

  报错信息一致。

 

因此, 如果是使用的主备mysql,需要手动切换master和slave,如果使用的是多主的mysql(例如,phxsql),需要设置failoverReadOnly=false

转载地址:http://rrxyl.baihongyu.com/

你可能感兴趣的文章
“不劳而获”的数字货币真的存在么?
查看>>
k8s拾遗 - Secret
查看>>
Android SparseArray 原理解析
查看>>
PHP类的定义
查看>>
Composer 中国镜像地址配置
查看>>
Java中抽象类和抽象方法的区别
查看>>
任务调度JOB
查看>>
有关通过web来发送东西的小记住
查看>>
socket和http有什么区别?
查看>>
关于“机器人离线编程”国内外近三年的研究
查看>>
计算机网络
查看>>
[04]javascript的数据类型
查看>>
[CC-SEABUB]Sereja and Bubble Sort
查看>>
JS设置cookie、读取cookie、删除cookie
查看>>
我的博客园的CSS和html设置
查看>>
数论基础(维诺格拉多夫著,裘光明译) 勘误
查看>>
vue-cookies的使用
查看>>
Code Signal_练习题_Make Array Consecutive2
查看>>
双向循环链表 初始化 插入 删除
查看>>
C#设计模式:职责链模式(Chain of Responsibility)
查看>>