今天看到公司之前的代码,静态方法调用数据库没有关闭,想知道这是为什么
这个是数据库连接类
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()方法中关闭下。
/**
* 释放资源
* @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;
}