zm12397
2017-05-31 15:49
采纳率: 66.7%
浏览 1.5k

Mysql读写分离,有时会写到从库里

SSH框架下mysql读写分离,使用了C3P0缓冲池,
为什么有时候我的写操作直接操作到了从库里,主库没有变?
控制台显示执行写操作前确实是转成master了的。。。。
跪求大神解答。。。

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • 525546523 2017-06-02 04:29
    已采纳

    DynamicDataSource 这个工具应该是第一次访问从数据源列表里面拿数据源,之后都从ThreadLocal缓存里面取得吧。要是这样的话,在同一个线程里面,第一次如果走从库的话,之后的写请求都会走从库的。

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • devmiao 2017-05-31 15:46
    评论
    解决 无用
    打赏 举报
  • oyljerry 2017-06-01 00:53

    是不是数据库主从发生了变化。看看数据库的日志和你的读写分离的相关日志。

    评论
    解决 无用
    打赏 举报
  • Hefei19881002 2017-06-01 05:53

    mysql主从复制是怎么配置的? 配置完之后必须要保证主节点和从节点的数据一致 并且把插入的数据配置到主节点

    评论
    解决 无用
    打赏 举报
  • zm12397 2017-06-01 08:06

    这是我数据源配置:

    <!-- 配置数据源这里使用了c3p0数据池,需导入c3p0的jar包以及其依赖包
    下面分别是主master数据源配置以及从slave数据源配置(这里的属性名与spring的不一样) -->
    <bean id="parentDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="initialPoolSize"><value>30</value></property>
        <property name="minPoolSize"><value>10</value></property>
        <property name="maxPoolSize"><value>50</value></property>
    </bean>
    <bean id="masterDataSource" parent="parentDataSource">
        <property name="driverClass" value="${master.jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${master.jdbc.url}" />
        <property name="user" value="${master.jdbc.username}" />
        <property name="password" value="${master.jdbc.password}" />
    </bean>
     <bean id="slaveDataSource" parent="parentDataSource">
         <property name="driverClass" value="${slave.jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${slave.jdbc.url}" />
        <property name="user" value="${slave.jdbc.username}" />
        <property name="password" value="${slave.jdbc.password}" />
    
    </bean>
    <bean id="dataSource" class="com.util.DynamicDataSource">  
        <property name="targetDataSources">  
            <map key-type="java.lang.String">  
                <entry key="slave" value-ref="slaveDataSource" />
                <entry key="master" value-ref="masterDataSource" />
            </map>  
        </property>  
        <property name="defaultTargetDataSource" ref="masterDataSource" /> 
    </bean>  
    **  然后我在切面中根据操作的类型来分别调用DynamicDataSource工具类的方法切换数据源,在执行过程中我把数据源的名称打印,明显是切换到了master,但是主库中没有数据,从库中才有,直接插入到从库了。。。。**
    
    评论
    解决 无用
    打赏 举报
  • Hefei19881002 2017-06-01 08:58

    需要修改mysql的配置文件 linux: /etc/mysql/my.cnf, windows: c:/program files/mysql/mysql 5.0/my.ini 主节点开启bin-log 从节点进行监听

    评论
    解决 无用
    打赏 举报
  • zm12397 2017-06-01 10:30

    已经排除了C3P0的问题了,用不用都这样。。。。

    评论
    解决 无用
    打赏 举报
  • 525546523 2017-06-02 04:29

    一般的主从数据源都是这么实现的

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题