`
wode66
  • 浏览: 738549 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql replication driver 在jdk1.6下失效问题解决

阅读更多

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

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. nnection out = 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. public class Driver extends NonRegisteringDriver implements java.sql.Driver {  
  2.     // ~ Static fields/initializers  
  3.     // ---------------------------------------------  
  4.   
  5.     //  
  6.     // Register ourselves with the DriverManager  
  7.     //  
  8.     static {  
  9.         try {  
  10.             java.sql.DriverManager.registerDriver(new Driver());  
  11.         } catch (SQLException E) {  
  12.             throw new RuntimeException("Can't register driver!");  
  13.         }  
  14.     }  
分享到:
评论
1 楼 changyy_1988 2015-05-21  
lz是在测试 还是在项目中真正用上了 我在项目了试了一下 没成功啊

相关推荐

Global site tag (gtag.js) - Google Analytics