我必须将Java服务器应用程序部署到Debian 8服务器。它尝试通过unix域套接字或tcp连接到MySQL服务器(取决于连接字符串)。它在我的Debian 9开发服务器上运行良好,但在实时服务器上给出了(如我所认为的)无用的错误消息。我对两台服务器都具有root访问权,但不允许在实时服务器上做很多事情。由于我在D9上编译Java并在D8上运行时遇到版本问题,因此我从Debian存储库中在D8上安装了openjdk-7-jdk和mysql java连接器,并将连接器jar复制(符号链接)到源的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
从有效的PHP代码复制并粘贴dbname,user,pwd和套接字文件路径。值得一提的是,我不是Java专家,使用这些较旧的库可能不知道某些知识。一些源代码:
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
我想念什么?为什么在服务器显然正在侦听并且套接字文件在那里并具有正确的权限的情况下,为什么我的连接被拒绝并丢失文件错误消息?
答案 0 :(得分:0)
没关系,我已经找到了解决方案(在发布问题后没有多少,而在开始出现问题后也是如此……照常)。
UDS:我只是将命名管道与unix域套接字混合在一起,后者是同一概念的两个完全不同的实现。 JDBC根本无法执行UDS。现在,我意识到我可能仅通过TCP连接在开发服务器上测试了我的代码。
TCP:服务器套接字已绑定到服务器的确切地址,因此localhost无法正常工作。我对连接拒绝错误的狭narrow思考完全误导了我。