项目使用的是连接池 com.alibaba.druid.pool.DruidDataSource
线上运行几年用的都是3306端口,接到需求要支持其他端口,发现修改端口无果。
解决方案
1 搭建本地3300端口和3306数据库测试环境
2 连接本地数据库确认3300端口异常3306端口正常
3 定位mysql连接创建并加入连接池的代码
4 定位mysql连接创建是否成功
5 模拟mysql连接创建操作,确认最终区别
方案实施
1确认连接池的数据差别仅仅在
jdbc:mysql://localhost:3300和jdbc:mysql://localhost:3306上,确认连接池没有问题
2写测试jdbc连接的方法
public int testConnect(String dbhost, String dbport, String dbname, String dbuser, String dbpw) {
java.sql.Connection conn = null;
if (telnet(dbhost,dbport) == 1)
{
return 1;
}
int flag = 1;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://" + dbhost + ":" + dbport + "/" + dbname, dbuser, dbpw);
if (conn != null) {
if (!conn.isClosed()) {
conn.close();
conn = null;
}
return 0;
}
} catch (Exception ex) {
ex.printStackTrace();
return 1;
}
return flag;
}
int a = testConnect(“localhost”, “3300”, “db”, “root”, “root”);
int b = testConnect(“localhost”, “3306”, “db”, “root”, “root”);
测试发现3300异常 3306正常
3 进入 getConnection查看源码找到
println(" trying " + aDriver.driver.getClass().getName());
Connection con = aDriver.driver.connect(url, info);
4猜测driver数据库驱动版本BUG
5找到版本信息
mysql
mysql-connector-java
5.1.9
百度之后发现确实存在这个BUG。替换新版后正常。
PS:框架系统BUG不可怕,耐心测试,细心观察一定能发现