关于数据库类静态调用没有关闭的问题

今天看到公司之前的代码,静态方法调用数据库没有关闭,想知道这是为什么

这个是数据库连接类

public class DBUtil {

private final static String URL = "jdbc:sqlserver://192.168.1.100:8080;DatabaseName=volador";
private static final String USER="user";
private static final String PASSWORD="123456";

private static Connection conn=null;
static{
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        conn=(Connection)DriverManager.getConnection(URL,USER,PASSWORD);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

public static Connection getConnection(){
    return conn;
}

public boolean addCameraInfo(String groupid,DeviceInfo de){     
    Statement stmt2;
    try {
        stmt2 = conn.createStatement();

        stmt2.executeUpdate
            ("insert into Camera_Info (name,cameraIp,camera_Vender,indexCode,cameraAddress,icon) values('"+de.szDevSrcAlias+"','"
    +de.getDeviceID()+"','"+de.getSzManufacturer()+"','"+de.getDeviceID()+"','"+groupid+"','"+"/source/ztreecss/zTreeStyle/img/diy/camera.png"+"')");


    } catch (SQLException e) {
        e.printStackTrace();
    }
return false;
}

下面这个是调用类
public class test {
static DBUtil=new DBUtil();

    public static void main(String[] args) throws InterruptedException
{   

while (!queueGrpId.isEmpty())
{
DBUtil.addCameraInfo(xxx,xxx,xx);
}
}
}
是没有关闭吗,还是不用关闭,因为while语句会执行很多次add方法,如果要关闭,怎么关闭,单独写一个关闭类在while后执行吗,请指教

如果有大神指教一下数据库静态调用和非静态调用区别就好了

不需要关闭。因为
private static Connection conn=null;
这个变量的作用域是整个程序,并且只有一个实例,所以不存在需要释放的情况。
当然也可以每次查询打开,查询完毕关闭,然而这样做意义不大,数据库连接并非是唯一的,反复打开关闭这唯一的连接没有什么性能上的提高。

哇 你们公司是有多传统
用原声的JDBC而且连连接池都不用的?

你所说的静态调用和非静态调用区别只是一个需要实例化 对象,一个只需要类名就可以调用,并且使用static修饰的对象会直接存放在 永久区 里,

看了你的DBUtil,这个类使用了单例模式的,也就是只有一个实例,所以一般不会关闭 conn连接,当然其实也是应该需要提供一个 关闭方法的,

但你这里没有提供,不然可能会一致保持和数据库的连接,这种连接是长连接,是比较占内存的。

最好在addCameraInfo()方法中关闭下。

需要关闭,像st、rs也是需要关闭的

  /**
     * 释放资源
     * @param conn
     * @param st
     * @param rs
     */
    public static void colseResource(Connection conn,Statement st,ResultSet rs) {
        closeResultSet(rs);
        closeStatement(st);
        closeConnection(conn);
    }

    /**
     * 释放连接 Connection
     * @param conn
     */
    public static void closeConnection(Connection conn) {
        if(conn !=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        conn = null;
    }

    /**
     * 释放语句执行者 Statement
     * @param st
     */
    public static void closeStatement(Statement st) {
        if(st !=null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        st = null;
    }

    /**
     * 释放结果集 ResultSet
     * @param rs
     */
    public static void closeResultSet(ResultSet rs) {
        if(rs !=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        rs = null;
    }