zoukankan      html  css  js  c++  java
  • mysql replication driver 在jdk1.6下失效问题解决

    mysql diver包里有relication driver,可以在jdbc层进行读写分离,主写从读
    默认的配置方式是指定driver为ReplicationDriver,并改写jdbc url
    一起jquery,17jquery

    Java代码收藏代码

    1. jdbc.driverClassName=com.mysql.jdbc.ReplicationDriver
    2. jdbc.url=jdbc:mysql://192.168.1.23:3306,192.168.1.252:3306/my_db?useUnicode=true

    ref.mysql doc 
    但是在jdk1.6(win)下,这个配置不生效。升级driver jar依旧如此,最后只好debug connect过程,发现datasource的driver加载过程并不是直接用定义的driverClass去forName加载直接建立连接,而是分两个步骤:
    Java代码收藏代码

    1. ensureDriverLoaded();//确认是否加载driver,否则forName加载
    2. nnectionout=driver().connect(jdbcUrl,overrideProps(username,password));//从已加载的drivers列表中取得能parseUrl的driver,并建立连接


    问题就在第二步里产生。

    com.mysql.jdbc下drivers的继承关系如下
    NonRegisteringDriver //包含主要逻辑,包括解析url 
    -|-Driver //空,无功能逻辑
    |-NonRegisteringReplicationDriver //主要的replication逻辑
    -|-ReplicationDriver //空,无功能逻辑

    在jdk1.5下,drivers列表仅有 ensureDriverLoader()加载的 ReplicationDriver; 
    在jdk1.6(win)下,ensureDriverLoader()方法加载 ReplicationDriver 过程里会先加载[com.mysql.jdbc.Driver, sun.jdbc.odbc.JdbcOdbcDriver](这里还没搞清楚,可能和jvm加载方式有关?)
    导致 com.mysql.jdbc.Driver 用来建立connection,而非配置的 ReplicationDriver,replication的从读被忽略了


    =============== 
    解决办法却和上面的问题无关,而是在jdbc url里配上完整的replication信息,用"jdbc:mysql:replication://"替换原来的"jdbc:mysql://" Java代码收藏代码

    1. jdbc.driverClassName=com.mysql.jdbc.ReplicationDriver
    2. jdbc.url=jdbc:mysql:replication://192.168.1.23:3306,192.168.1.252:3306/my_db?useUnicode=true


    因为在 Top driver的connect() 里实现了 ReplicationDriver的connect()功能,前提就是url里有replication串。

    mysql driver代码里的诡异实现,难道是某种补丁?

    关于Driver 和 ReplicationDriver的无功能逻辑的解释,只有这一个功能,载入实际功能类 
    Java代码收藏代码

    1. publicclassDriverextendsNonRegisteringDriverimplementsjava.sql.Driver{
    2. //~Staticfields/initializers
    3. //---------------------------------------------
    4. //
    5. //RegisterourselveswiththeDriverManager
    6. //
    7. static{
    8. try{
    9. java.sql.DriverManager.registerDriver(newDriver());
    10. }catch(SQLExceptionE){
    11. thrownewRuntimeException("Can'tregisterdriver!");
    12. }
    13. }
    关键字:mysql, ReplicationDriver mysql
  • 相关阅读:
    《白骨精学习法》 21世纪职场必备学习技巧
    英雄不问出处
    整理ArcSDE 安装过程出现问题以及解决方法系列
    ArcEngine9.1结合VS2005开发技巧2则
    推荐一界面控件DotNetBar(含附件)
    常用易忘记Oracle命令(待续)
    ArcSDE中间件技术的生命力(蔡晓兵)
    ArcSDE 的存储机制
    (收藏)ITPUB的ORACLE之常用FAQ V1.0
    ORA01691错误
  • 原文地址:https://www.cnblogs.com/seasonzone/p/3400177.html
Copyright © 2011-2022 走看看