日期:2014-05-20  浏览次数:20662 次

数据库连接关闭问题
package com.gimismachn.util;

import java.sql.ResultSet;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import com.gimis.server.ServerConfig;
import com.gimismachn.dao.Util;
import com.gimismachn.database.Database;

public class ChangeState {
static Database db = new Database();// 数据库连接

//方法一
public String getStateByMachn_code(String machn_code) {
String sql = "select state from ftlw.t_machn_state where machn_code='"
+ machn_code + "'";
ResultSet rs = null;
String state = "";
try {
rs = db.getRS(sql);
if (rs.next()) {
state = Util.CNull(rs.getString("state"));
}

} catch (Exception e) {
ServerConfig.logger.error("", e);
}

return state;
}

//方法二
public void setState(String machn_code, String oldState, String newState,
HttpServletRequest request) {
if (machn_code == null || "".equals(machn_code)) {

return;
} else if (oldState == newState) {
return;
} else {

SessionInfo sessionInfo = (SessionInfo) request.getSession()
.getAttribute("sessionInfo");
String userName = Util.CNull(sessionInfo.getUserName());
String time = null;
try {
Date dateTime = new Date();
time = FormatDate.toY_M_D_H_M_S(dateTime);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

String sql = "insert into ftlw.t_machn_changestate (machn_code ,old_state,new_state,server_time,sysuser_name) values('"
+ machn_code
+ "','"
+ oldState
+ "','"
+ newState
+ "','"
+ time + "','" + userName + "')";

try {
db.execSqlUpdate(sql);

} catch (Exception e) {
ServerConfig.logger.error("", e);
} finally {
db.cleanup();
}

}
}
}
上面是我写的一个通用的工具类,两个方法,我在全局里面创建了一个数据库连接,程序中每次使用这个类时,两个方法都是调用,而且都是先调用一,再调用二。然后我在方法二中把数据库连接关闭 db.cleanup();方法,我想知道这样做有没有问题
会不会对数据库连接有影响,这个问题比较敏感,所以希望真正知道的人回答,如果不清楚希望跟我一样等大瞎求解。

------解决方案--------------------
全局的没关系。
静态的在Java里只意味着数据存储地址变了,似乎没有更特别的。
你总有数据库的操作类吧,假定是mysql
当你构建这个类的对象时:mysql mysql = new mysql("C:\\hhh.sql","name","password");
当你要查询时,似乎可以多次查询,(这个不用关闭)
就是说:
mysql.connect()
while(true){
mysql.query();
}
mysql.disConnect();
要是你要插入,修改,删除等对数据库结构产生变化的操作时,你必须一个操作打开一次,关闭一次,不能只打开一次
就是说:
while(true){
mysql.connect()
mysql.update();
mysql.disConnect();

mysql.connect()
mysql.add();
mysql.disConnect();

mysql.connect()
mysql.delete();
mysql.disConnect();
}
严格来说,第二类操作都是有executeUpdate()完成的,所以可以说这个方法的生命期是一次操作,不能把连接关闭放在while循环外部。也不能内部只有一次连接关闭操作。就是说,必须一次操作,就连接一次。
至于说具体问题,我表示我逃跑了,哈哈

------解决方案--------------------
假定你是个Web环境的程序,同时有两个用户请求你的程序。

你能设想你程序应该怎么执行,才能避免第一个用户执行到 finally {db.cleanup();} 的时候要等等第二个用户先把之前的SQL执行完?

此外,由于你的数据库连接是在new这个对象的时候就连接的,那么当执行过一次db.cleanup()后,第三个用户再请求你的程序的时候,你通过什么机制去打开这个连接?

总的来说,作为良好的模块化程序设计而言,不建议你用这样的设计结构。