- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在 ReplicationDriver 中使用 mysql 主/从复制(写入主从读取)。我的连接 URL 如下:
"jdbc:mysql:replication://master:3306,slave1:3307,slave2:3308/sampledb?allowMasterDownConnections=true"
我使用 Spring + Spring MyBatis 模块。
我已将我的交易标记为只读,如下所示:
@Override
@Transactional(rollbackFor=Exception.class,readOnly=true)
public Sample getSample(SampleKey sampleKey) throws SampleException {
//Call MyBastis based DAO with "select" queries.
}
但是,当我看到事务/数据库日志时,它显示即使对于“只读”事务,ReplicationDriver 也会首先命中主控。注意“Acquired Connection”和“Releaving JDBC connection”行。
为什么会这样?
1) 不管它是只读查询,JDBC驱动是否仍然“ping”主服务器以检查它是否处于事件状态,然后转到从服务器进行实际查询?
2) 如果 readOnly=true ,Spring 不设置底层 Connection 对象的 readOnly(true) 吗?
2014-03-19 12:32:28,280 DEBUG [http-8080-2] [AbstractPlatformTransactionManager.java:365] - Creating new transaction with name [com.rakuten.gep.foo.businesslogic.impl.SampleBusinessLogicImpl.getSample]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; '',-java.lang.Exception
2014-03-19 12:32:28,390 DEBUG [http-8080-2] [DataSourceTransactionManager.java:204] - Acquired Connection [jdbc:mysql://master:3306/, UserName=root@10.174.10.72, MySQL Connector Java] for JDBC transaction
CACHED DAO
Trying to retrive from the Cache
2014-03-19 12:32:31,334 DEBUG [http-8080-2] [Slf4jImpl.java:47] - ooo Using Connection [jdbc:mysql://slave1:3307/, UserName=root@10.174.10.72, MySQL Connector Java]
2014-03-19 12:32:31,334 DEBUG [http-8080-2] [Slf4jImpl.java:47] - ==> Preparing: select tbl.item_id, tbl.item_name, tbl.create_time, tbl.update_time from sample_tbl tbl where tbl.item_id=?
2014-03-19 12:32:31,335 DEBUG [http-8080-2] [Slf4jImpl.java:47] - ==> Parameters: 79bc3c80-af0a-11e3-a8e4-b8e8560f9d02(String)
Adding SampleTbl id to cache : 79bc3c80-af0a-11e3-a8e4-b8e8560f9d02
2014-03-19 12:32:31,340 DEBUG [http-8080-2] [AbstractPlatformTransactionManager.java:752] - Initiating transaction commit
2014-03-19 12:32:31,342 DEBUG [http-8080-2] [DataSourceTransactionManager.java:264] - Committing JDBC transaction on Connection [jdbc:mysql://slave1:3307/, UserName=root@10.174.10.72, MySQL Connector Java]
2014-03-19 12:32:31,382 DEBUG [http-8080-2] [DataSourceTransactionManager.java:322] - Releasing JDBC Connection [jdbc:mysql://master:3306/, UserName=root@10.174.10.72, MySQL Connector Java] after transaction
我的连接设置是:
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/sample"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
username="root"
password="root"
driverClassName="com.mysql.jdbc.ReplicationDriver"
url="jdbc:mysql:replication://master:3306,slave1:3307,slave2:3308/sampledb?allowMasterDownConnections=true"
connectionCachingEnabled="true"
connectionCacheProperties="{MaxStatementsLimit=10}"
removeAbandoned="true"
removeAbandonedTimeout="600"
logAbandoned="true"
timeBetweenEvictionRunsMillis="1000"
minEvictableIdleTimeMillis="1000"
testOnBorrow="false"
testOnReturn="false"
validationQuery="select null"
testWhileIdle="true"
maxActive="10"
maxIdle="3"
maxWait="1000"
defaultAutoCommit="false"/>
</Context>
最佳答案
您所看到的是 MySQL JDBC 驱动程序正在管理与物理服务器(无论是主服务器还是从服务器)的连接这一事实的副作用。连接池和 Spring 事务管理器都不知道数据库连接正在与多个服务器通信这一事实。一切看起来都正常工作,但我会解释为什么它看起来像是在使用主连接。
希望这会有所帮助。如果您需要更详细的信息,请告诉我。
关于Mysql主/从复制。即使读取查询也连接到主? (驱动程序 "ping"在去从属之前是否主控?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22495722/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!