为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:6
【操作系统】:linux
【CPU】:
【问题描述】在服务器通过端口映射的方式访问windows上运行的数据库端口时,无法正确访问,但是windows上通过manager工具可以正常查询:。
ssh命令 ssh -R 12346:127.0.0.1:12345 XXX
测试脚本
#!/bin/bash
# ================= 配置区域 =================
# 1. 请修改为你的 jar 包在服务器上的实际路径 (绝对路径或相对路径)
JAR_PATH="./DmJdbcDriver.jar"
# 2. 数据库信息
DB_HOST="127.0.0.1"
DB_PORT="12346" # SSH 隧道端口
DB_USER="SYSDBA"
DB_PASS="SYSDBA"
SCHEMA="XNYBS" # 模式名
# 3. 驱动类名 (DM6 通常是 dm.jdbc.driver.DmDriver,如果报错尝试 dm.jdbc.driver.DmDriver)
DRIVER_CLASS="dm.jdbc.driver.DmDriver"
# ===========================================
# 颜色
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'
echo "========================================"
echo " 达梦数据库 Java JDBC 测试工具"
echo "========================================"
# 1. 检查 Java 环境
if ! command -v java &> /dev/null; then
echo -e "${RED}❌ 未检测到 Java 环境,请先安装 JDK/JRE${NC}"
exit 1
fi
if ! command -v javac &> /dev/null; then
echo -e "${RED}❌ 未检测到 javac (编译器),请安装 JDK (yum install java-1.8.0-openjdk-devel)${NC}"
echo "注意:仅有 JRE 是不够的,需要编译 Java 代码。"
exit 1
fi
# 2. 检查 Jar 包
if [ ! -f "$JAR_PATH" ]; then
echo -e "${RED}❌ 未找到驱动文件: $JAR_PATH${NC}"
echo "请修改脚本中的 JAR_PATH 变量为实际路径。"
exit 1
fi
echo -e "${GREEN}✅ 驱动文件存在: $JAR_PATH${NC}"
# 3. 生成 Java 源代码
cat > DmTest.java <<EOF
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class DmTest {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String url = "jdbc:dm://$DB_HOST:$DB_PORT?schema=$SCHEMA";
String user = "$DB_USER";
String password = "$DB_PASS";
String driver = "$DRIVER_CLASS";
try {
// 加载驱动
Class.forName(driver);
System.out.println("正在连接数据库: " + url);
// 建立连接
conn = DriverManager.getConnection(url, user, password);
System.out.println("[Success] 数据库连接建立成功!");
// 切换模式 (虽然 URL 里带了 schema 参数,但强制切换更保险)
stmt = conn.createStatement();
try {
stmt.execute("SET SCHEMA $SCHEMA");
System.out.println("[Success] 模式切换到 $SCHEMA 成功");
} catch (Exception e) {
System.out.println("[Warning] 切换模式警告: " + e.getMessage());
}
// 执行查询
// 这里查询刚才说的 3 张关键表
String[] tables = {"RBASE_AREA_INFO", "RBASE_FARM_INFO", "RDATA_REAL_POWER15"};
System.out.println("\n--- 开始查询表统计 ---");
for (String tbl : tables) {
try {
rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tbl);
if (rs.next()) {
int count = rs.getInt(1);
System.out.println("✅ 表 " + tbl + " 存在,行数: " + count);
}
rs.close();
} catch (SQLException e) {
System.out.println("❌ 表 " + tbl + " 查询失败: " + e.getMessage());
}
}
System.out.println("----------------------");
} catch (ClassNotFoundException e) {
System.out.println("[Error] 找不到驱动类: " + driver);
System.out.println("请检查 JAR 包版本是否匹配,或者类名是否正确。");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("[Error] SQL 执行错误 (ErrorCode: " + e.getErrorCode() + ")");
e.printStackTrace();
} finally {
try { if(stmt!=null) stmt.close(); } catch(Exception e){}
try { if(conn!=null) conn.close(); } catch(Exception e){}
}
}
}
EOF
# 4. 编译 Java 代码
echo "正在编译 Java 代码..."
javac -encoding UTF-8 -cp ".:$JAR_PATH" DmTest.java
if [ $? -ne 0 ]; then
echo -e "${RED}❌ 编译失败${NC}"
exit 1
fi
# 5. 运行 Java 代码
echo "正在运行测试..."
echo "----------------------------------------"
# Linux 下 classpath 分隔符是冒号 :
java -cp ".:$JAR_PATH" DmTest
echo "----------------------------------------"
# 6. 清理临时文件
rm -f DmTest.java DmTest.class
echo "测试结束。"
报错
(power_net) wangziqin@NGN-3080:~/PowerNet$ ./test_java.sh
========================================
达梦数据库 Java JDBC 测试工具
========================================
✅ 驱动文件存在: ./DmJdbcDriver.jar
正在编译 Java 代码...
正在运行测试...
----------------------------------------
正在连接数据库: jdbc:dm://127.0.0.1:12346?schema=XNYBS
[Error] SQL 执行错误 (ErrorCode: 6001)
java.sql.SQLException: 网络通信异常
at dm.jdbc.dbaccess.DBError.throwSQLException(Unknown Source)
at dm.jdbc.driver.DmdbCSI.startupServer(Unknown Source)
at dm.jdbc.driver.DmdbCSI.<init>(Unknown Source)
at dm.jdbc.driver.DmdbConnection.<init>(Unknown Source)
at dm.jdbc.driver.DmDriver.connect(Unknown Source)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at DmTest.main(DmTest.java:24)
----------------------------------------
测试结束。
SSH 隧道端口与数据库端口弄混淆了,代码要修正一下。
SSH 隧道端口:12346
数据库端口:12345

建议先在设备上通过网络探测工具如telnet探测到达目的端口是否畅通