Java JDBC可以';t从单独的类连接到我的数据库。类DB创建连接

Java JDBC可以';t从单独的类连接到我的数据库。类DB创建连接,java,sql-server,database,jdbc,prepared-statement,Java,Sql Server,Database,Jdbc,Prepared Statement,我一直试图让我的JDBC数据库连接从它自己的独立类(DB.java)执行,这样每当我想从我的任何其他多个类(例如CusTab.java)创建一个新连接时,我就可以创建一个DB实例。在运行第一个测试(将表内容打印到控制台)后,我发现自己出现了一个错误: Something wrong with prepared statement test com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed. at c

我一直试图让我的JDBC数据库连接从它自己的独立类(DB.java)执行,这样每当我想从我的任何其他多个类(例如CusTab.java)创建一个新连接时,我就可以创建一个DB实例。在运行第一个测试(将表内容打印到控制台)后,我发现自己出现了一个错误:

Something wrong with prepared statement test
com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:388)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.prepareStatement(SQLServerConnection.java:2166)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.prepareStatement(SQLServerConnection.java:1853)
at marsPackage.CusTab.<init>(CusTab.java:129)
这是我将一个简单的结果集打印到控制台的测试,它来自CusTab.java类,因为这个类中的代码非常庞大,所以我将只输入我尝试使用DB的代码段

            DB db = new DB();
        try {
            String sql = "SELECT * FROM PROJECT_STATUS;";
            PreparedStatement Stmt = db.getConnection().prepareStatement(sql);
            ResultSet rs = Stmt.executeQuery();
        while(rs.next()){
                System.out.println("PRO_STATUS_ID: "+rs.getString(1));
                System.out.println("PRO_STATUS_NAME: "+rs.getString(2));    
        }
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            System.err.println("Something wrong with prepared statement test");
            e1.printStackTrace();
        }
我提前感谢你抽出时间

更新:通过@ppuskar建议,我能够解决这个问题。我删除了DB类中的Finally块,因为它过早地关闭了我的连接。然后我在DB.java中添加了一个close()方法,这个方法在使用时关闭连接

/*
        finally{
            if (dbConn != null)
                try{dbConn.close();} catch(SQLException e){e.printStackTrace();}
        }*/
    }
    return dbConn;
}

public void close(){
    try {
        dbConn.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        System.err.println("Could not close the connection");
        e.printStackTrace();
    }
}

看看getConnection()API,您正在finally块中关闭连接。顺便说一句,我不明白您为什么要执行
useStmt.executeUpdate()在getConnection()中

我在重用在这里找到的解决方案,我认为他在finally块中关闭连接的原因是为了在使用完连接后关闭连接。但是,我已经删除了finally块和useStmt.executeUpdate();你是对的,这行代码毫无意义。我没有使用finally块,而是创建了一个在调用时关闭连接的新方法。我将用我的更改更新我的问题,这些更改修复了问题。
/*
        finally{
            if (dbConn != null)
                try{dbConn.close();} catch(SQLException e){e.printStackTrace();}
        }*/
    }
    return dbConn;
}

public void close(){
    try {
        dbConn.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        System.err.println("Could not close the connection");
        e.printStackTrace();
    }
}