mysql replication driver 在jdk1.6下失效问题解决
2013-10-31 21:12
411 查看
mysql diver包里有relication driver,可以在jdbc层进行读写分离,主写从读
默认的配置方式是指定driver为ReplicationDriver,并改写jdbc url
一起jquery,17jquery
jdbc.driverClassName=com.mysql.jdbc.ReplicationDriver
jdbc.url=jdbc:mysql://192.168.1.23:3306,192.168.1.252:3306/my_db?useUnicode=true
ref.mysql doc
ensureDriverLoaded();//确认是否加载driver,否则forName加载
nnectionout=driver().connect(jdbcUrl,overrideProps(username,password));//从已加载的drivers列表中取得能parseUrl的driver,并建立连接
jdbc.driverClassName=com.mysql.jdbc.ReplicationDriver
jdbc.url=jdbc:mysql:replication://192.168.1.23:3306,192.168.1.252:3306/my_db?useUnicode=true
publicclassDriverextendsNonRegisteringDriverimplementsjava.sql.Driver{
//~Staticfields/initializers
//---------------------------------------------
//
//RegisterourselveswiththeDriverManager
//
static{
try{
java.sql.DriverManager.registerDriver(newDriver());
}catch(SQLExceptionE){
thrownewRuntimeException("Can'tregisterdriver!");
}
}
[align=center]关键字:mysql, ReplicationDriver mysql[/align]
默认的配置方式是指定driver为ReplicationDriver,并改写jdbc url
一起jquery,17jquery
Java代码
jdbc.driverClassName=com.mysql.jdbc.ReplicationDriverjdbc.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代码
ensureDriverLoaded();//确认是否加载driver,否则forName加载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代码
jdbc.driverClassName=com.mysql.jdbc.ReplicationDriverjdbc.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代码
publicclassDriverextendsNonRegisteringDriverimplementsjava.sql.Driver{//~Staticfields/initializers
//---------------------------------------------
//
//RegisterourselveswiththeDriverManager
//
static{
try{
java.sql.DriverManager.registerDriver(newDriver());
}catch(SQLExceptionE){
thrownewRuntimeException("Can'tregisterdriver!");
}
}
[align=center]关键字:mysql, ReplicationDriver mysql[/align]
相关文章推荐
- 解决c3p0 mysql八小时连接失效问题
- mysql查找语句中包含中文字符时查询失效的问题及解决方法
- 解决ADF+MySQL Table filter失效问题
- Mac OS X安装JDK1.6及相关备忘 解决了找不到tools.jar的问题
- 解决在pom.xml文件中出现Missing artifact jdk.tools:jdk.tools:jar:1.6问题
- 关于play从jdk1.6换到jdk1.8时报错问题的解决办法
- 关于No suitable driver found for com.mysql.jdbc.Driver问题的解决办法
- 使用cxf 关于JAXB2.1和JDK1.6/6.0版本不一致的问题 --已解决
- [bigdata] 启动CM出现 “JDBC Driver class not found: com.mysql.jdbc.Driver” 以及“Error creating bean with name 'serverLogFetcherImpl'”问题的解决方法
- ambari-server启动出现Caused by: java.lang.RuntimeException:java.lang.ClassNotFoundEception:com.mysql.jdbc.Driver问题解决办法(图文详解)
- MySQLDriverCS 中文乱码 问题解决
- 关于解决"No suitable driver found for jdbc:mysql:/localhost:3306"问题的步骤
- 把之前安装的jdk1.7换成1.6之后在dos命令Java -version 死活1.7问题解决
- 解决QT5.2及以上版本连接mysql提示QMYSQL driver not download 问题
- MySQLDriverCS 不支持问题解决 Uint 4.0 .net 2.0
- PowerDesigner导入MySql步骤和解决问题Non SQL Error : Could not load class com.mysql.jdbc.Driver
- [MySQL][ODBC 3.51 Driver][mysqld-5.5.37-log]Table 'ldk2.T_User' doesn't exist问题解决
- Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver问题解决方案
- 解决jdk1.6已经安装,编译android源码报错问题
- 解决MySQL复合主键下ON DUPLICATE KEY UPDATE语句失效问题