我必须将我的java服务器应用程序部署到Debian8服务器上。它尝试通过unix域套接字或tcp(取决于连接字符串)连接到mysql服务器。它在我的Debian9开发服务器上运行良好,但在实时服务器上给出了(我认为)无用的错误消息。我对这两个服务器都有root访问权限,但不允许在实时服务器上做太多工作。由于在d9上编译java和在d8上运行java时遇到版本问题,我从debian repo在d8上安装了openjdk-7-jdk和mysql java连接器,将连接器jar复制(symlinked)到源代码的lib目录,并重新编译了应用程序。现在它启动了,但在尝试连接到数据库时,它会抛出以下错误:
TCP: Connection refused
UDS: File not found (nonexistent file or device) ((the translation may not be correct, sorry))
这两个连接(tcp和uds)都可以在php和pdo中正常工作。连接字符串:
TCP: jdbc:mysql://localhost/<dbname>?user=<user>&password=<pwd>&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=utf8
UDS: jdbc:mysql:///<dbname>?socketFactory=com.mysql.jdbc.NamedPipeSocketFactory&namedPipePath=/var/run/mysqld/mysqld.sock&user=<user>&password=<pwd>&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=utf8
dbname、user、pwd和socket文件路径是从工作php代码中复制和粘贴的。值得注意的是,我不是javaMaven,我可能不知道使用这些旧库应该知道什么。一些源代码:
Class.forName("java.sql.Driver");
...
Connection db = DriverManager.getConnection(Settings.sqlConnection.value);
try(Statement stmt = c.createStatement())
{
stmt.execute("SET @now = UTC_TIMESTAMP()");
}
...
版本信息:
Debian 8.7
MySQL server 5.5.53-0+deb8u1
java version "1.7.0_181"
OpenJDK Runtime Environment (IcedTea 2.6.14) (7u181-2.6.14-1~deb8u1)
OpenJDK 64-Bit Server VM (build 24.181-b01, mixed mode)
mysql-connector-java-5.1.42.jar
我错过了什么?为什么我会收到连接被拒绝和缺少文件的错误消息,而显然服务器正在侦听,套接字文件在那里,并且具有正确的权限-其他客户端可以连接?
1条答案
按热度按时间qjp7pelc1#
不管怎样,我已经得到了解决方案(在发布问题后不多,在开始出现问题后也有很多)。。。和往常一样)。
uds:我只是把命名管道和unix域套接字混为一谈,它们是同一概念的两个完全不同的实现。jdbc根本不能做uds。现在我意识到我在dev服务器上测试了我的代码,可能只使用tcp连接。
tcp:服务器套接字绑定到服务器的确切地址,因此localhost无法工作。我对连接的狭隘思考完全误导了我。