Bug #24004 Cannot running MXJ as part of the JDBC driver on non-3306 ports when ...
Description:
I Cannot running MXJ as part of the JDBC driver on non-3306 ports when the port is running an mysql-nt Thread.
//*********test code begin
public void testJDBC() throws Exception{
String mysqldir = "d:/mysqltest";
String url = "jdbc:mysql://localhost:3336/mysql?" +
"socketFactory=com.mysql.management.driverlaunched.ServerLauncherSocketFactory" +
"&server.basedir="+mysqldir+"&server.datadir="+mysqldir+"/data";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, "root", "");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT VERSION()");
rs.next();
String version = rs.getString(1);
rs.close();
conn.close();
System.out.println(version);
}
//*********test code end
This method in the test case cannot run twice! The errors trace is :
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.lang.RuntimeException
MESSAGE: Mysqld at D:\mysqltest is running on port 3306 not 3336
STACKTRACE:
java.lang.RuntimeException: Mysqld at D:\mysqltest is running on port 3306 not 3336
at com.mysql.management.driverlaunched.ServerLauncherSocketFactory.ensureMysqlStarted(ServerLauncherSocketFactory.java:94)
at com.mysql.management.driverlaunched.ServerLauncherSocketFactory.connect(ServerLauncherSocketFactory.java:58)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:276)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2666)
at com.mysql.jdbc.Connection.<init>(Connection.java:1531)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.mysql.management.driverlaunched.ServerLauncherSocketFactoryTest.testJDBC(ServerLauncherSocketFactoryTest.java:213)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
** END NESTED EXCEPTION **
Last packet sent to the server was 31 ms ago.
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2741)
at com.mysql.jdbc.Connection.<init>(Connection.java:1531)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.mysql.management.driverlaunched.ServerLauncherSocketFactoryTest.testJDBC(ServerLauncherSocketFactoryTest.java:213)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Because the mysql-nt.exe is running on port 3336, the message "Mysqld at D:\mysqltest is running on port 3306 not 3336" is obviously wrong.
The reason is in class "com.mysql.management.driverlaunched.ServerLauncherSocketFactory", the method is "ensureMysqlStarted":
//************
if (mysqld.isRunning()) {
Object runningPort = mysqld.getServerOptions().get(
MysqldResourceI.PORT);
if (!runningPort.equals(Integer.toString(port))) {
String msg = "Mysqld at " + mysqld.getBaseDir()
+ " is running on port " + runningPort + " not " + port;
throw new RuntimeException(msg);
}
return;
}
//************
In the code before, if mysqld.isRunning() is true, the runningPort always is "3306". so always " throw new RuntimeException(msg)".
How to repeat:
Please use the test code in the description.
Suggested fix:
//************
if (mysqld.isRunning()) {
Object runningPort = mysqld.getServerOptions().get(
MysqldResourceI.PORT);
if (!runningPort.equals(Integer.toString(port))) {
String msg = "Mysqld at " + mysqld.getBaseDir()
+ " is running on port " + runningPort + " not " + port;
throw new RuntimeException(msg);
}
return;
}
//************
Change to:
//************
if (mysqld.isRunning()) {
return;
}
//************
Then I can run my test code. but I am not sure whether it's suitable.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.053 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: I Cannot running MXJ as part of the JDBC driver on non-3306 ports when the port is running an mysql-nt Thread. //*********test code begin public void testJDBC() throws Exception{ String mysqldir = "d:/mysqltest"; String url = "jdbc:mysql://localhost:3336/mysql?" + "socketFactory=com.mysql.management.driverlaunched.ServerLauncherSocketFactory" + "&server.basedir="+mysqldir+"&server.datadir="+mysqldir+"/data"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, "root", ""); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT VERSION()"); rs.next(); String version = rs.getString(1); rs.close(); conn.close(); System.out.println(version); } //*********test code end This method in the test case cannot run twice! The errors trace is : com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.lang.RuntimeException MESSAGE: Mysqld at D:\mysqltest is running on port 3306 not 3336 STACKTRACE: java.lang.RuntimeException: Mysqld at D:\mysqltest is running on port 3306 not 3336 at com.mysql.management.driverlaunched.ServerLauncherSocketFactory.ensureMysqlStarted(ServerLauncherSocketFactory.java:94) at com.mysql.management.driverlaunched.ServerLauncherSocketFactory.connect(ServerLauncherSocketFactory.java:58) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:276) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2666) at com.mysql.jdbc.Connection.<init>(Connection.java:1531) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at com.mysql.management.driverlaunched.ServerLauncherSocketFactoryTest.testJDBC(ServerLauncherSocketFactoryTest.java:213) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) ** END NESTED EXCEPTION ** Last packet sent to the server was 31 ms ago. at com.mysql.jdbc.Connection.createNewIO(Connection.java:2741) at com.mysql.jdbc.Connection.<init>(Connection.java:1531) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at com.mysql.management.driverlaunched.ServerLauncherSocketFactoryTest.testJDBC(ServerLauncherSocketFactoryTest.java:213) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) Because the mysql-nt.exe is running on port 3336, the message "Mysqld at D:\mysqltest is running on port 3306 not 3336" is obviously wrong. The reason is in class "com.mysql.management.driverlaunched.ServerLauncherSocketFactory", the method is "ensureMysqlStarted": //************ if (mysqld.isRunning()) { Object runningPort = mysqld.getServerOptions().get( MysqldResourceI.PORT); if (!runningPort.equals(Integer.toString(port))) { String msg = "Mysqld at " + mysqld.getBaseDir() + " is running on port " + runningPort + " not " + port; throw new RuntimeException(msg); } return; } //************ In the code before, if mysqld.isRunning() is true, the runningPort always is "3306". so always " throw new RuntimeException(msg)". How to repeat: Please use the test code in the description. Suggested fix: //************ if (mysqld.isRunning()) { Object runningPort = mysqld.getServerOptions().get( MysqldResourceI.PORT); if (!runningPort.equals(Integer.toString(port))) { String msg = "Mysqld at " + mysqld.getBaseDir() + " is running on port " + runningPort + " not " + port; throw new RuntimeException(msg); } return; } //************ Change to: //************ if (mysqld.isRunning()) { return; } //************ Then I can run my test code. but I am not sure whether it's suitable.