Error establishing socket.错误排除

本文介绍了一次解决SQLServer通过JDBC连接失败的问题过程。作者发现错误原因为指定的端口与实际使用的端口不符,并给出了正确的配置方法。
 
一次在重装系统并重新搭建JAVA运行环境后,为了测试运行环境是否搭建好,
写了一个非常简单的JDBC程序测试数据库连接。
IDE:Eclipse3.2
DB:SQLServer2000
Driver:MS的官方驱动:msbase.jar、mssqlserver.jar、msutil.jar
源程序如下:
文件名:SqlServerTest.java
package test;
 
import java.sql.*;
 
/**
 *  @author  lpeter
 *  SQLServer连接测试
 */
public  class SqlServerTest {
    //驱动类
    static String driverClass =
       "com.microsoft.jdbc.sqlserver.SQLServerDriver";
    //连接字符串
    static String url =
       "jdbc:microsoft:sqlserver://127.0.0.1:1433;dataBaseName=Test";
    //密码
    static String password = "peter";
   //用户名
    static String username = "peter";
    //待执行的SQL语句
    static String sql = "SELECT * FROM Test";
 
    public static void main(String[] args) {
       Connection conn = null;
       PreparedStatement pstmt = null;
       ResultSet rs = null;
 
       try {
           Class.forName(driverClass);
           conn = DriverManager.getConnection(url, username, password);
           pstmt = conn.prepareStatement(sql);
           rs = pstmt.executeQuery();
           while (rs.next()) {
              System.out.println("OK.");
           }
           System.out.println("OK too.");
           rs.close();
           pstmt.close();
           conn.close();
       } catch (ClassNotFoundException e) {
           System.out.println("驱动类没有找到.");
           e.printStackTrace();
       } catch (SQLException e) {
           e.printStackTrace();
       } finally {
           if (rs != null) //结果集没有关闭时关闭结果集
              try {
                  rs.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
           if (pstmt != null) //发送对象没有关闭时关闭发送对象
              try {
                  pstmt.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
           if (conn != null//连接没有关闭时关闭连接
              try {
                  conn.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
       }
 
    }
}
执行这段程序时,出现错误:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
    at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
    at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    at com.microsoft.jdbc.sqlserver.tds.TDSConnection.<init>(Unknown Source)
    at com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown Source)
    at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown Source)
    at com.microsoft.jdbc.base.BaseConnection.open(Unknown Source)
    at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:523)
    at java.sql.DriverManager.getConnection(DriverManager.java:171)
    at test.SqlServerTest.main(SqlServerTest.java:29)
 
出现了这个错误,我马上想到连接字符串有问题。可在网上找了好几个版本都是这样。
后来由于某种偶然原因,我知道了SQLServer可以设置查看端口号。步骤如下:
1. 打开企业管理器,依次在控制台根目录->Microsoft SQL Servers->SQL Server 组,列出一部分数据库服务器。
2. 右击我们要连接的数据库服务器,选择属性,在常规选项卡点击网络配置弹出新窗口。
3. 在启用的协议区域我们选择TCP/IP,点击属性按钮,弹出新窗口。在这个窗口有网络协议默认值设置,我在这里看到我的默认端口是:4067。因而在使用1433连接数据库时出错。
 
把端口号修改为4067即修改:
static String url =
       "jdbc:microsoft:sqlserver://127.0.0.1:1433;dataBaseName=Test";
为:
static String url =
       "jdbc:microsoft:sqlserver://127.0.0.1:4067;dataBaseName=Test";
后,执行程序,输出:OK too.
 
测试连接成功。
 
在Kubernetes(k8s)环境中遇到数据库连接错误Error establishing a database connection”,可以按以下方面排查解决: ### 网络层面 - **服务可达性**:要确保Kubernetes集群内部的Pod可以访问数据库服务。可以在Pod内部使用`ping`和`telnet`命令来测试网络连通性。例如,若数据库服务监听在`mydb-service`的3306端口,可在Pod内执行以下命令: ```bash ping mydb-service telnet mydb-service 3306 ``` - **网络策略**:检查是否存在网络策略(NetworkPolicy)限制了Pod与数据库之间的通信。确保网络策略允许相关的流量通过。 ### 配置层面 - **数据库连接信息**:确认应用程序的配置文件中数据库的连接信息(如主机名、端口、用户名、密码等)是否正确。这些信息可能通过环境变量或配置文件注入到Pod中。例如,在Deployment中通过环境变量设置数据库连接信息: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app-container image: my-app-image env: - name: DB_HOST value: mydb-service - name: DB_PORT value: "3306" - name: DB_USER value: myuser - name: DB_PASSWORD value: mypassword ``` - **数据库服务配置**:检查数据库服务(如Service)的配置是否正确,包括服务类型、端口映射等。确保服务能够正确地将流量转发到数据库Pod。 ### 数据库层面 - **数据库状态**:确认数据库Pod是否正常运行,可使用以下命令查看Pod状态: ```bash kubectl get pods -l app=mydb ``` 如果数据库Pod处于异常状态,可查看其日志以获取更多信息: ```bash kubectl logs <mydb-pod-name> ``` - **数据库资源限制**:检查数据库Pod的资源限制(如CPU、内存)是否足够。如果资源不足,可能会导致数据库无法正常运行,从而引发连接错误。 ### 其他方面 通过逐步排查上述问题,应该能够找到并解决 “Error establishing a database connection” 的问题。如果问题仍然存在,建议联系数据库管理员或技术支持以获取进一步帮助 [^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值