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();方法,我想知道这样做有没有问题
会不会对数据库连接有影响,这个问题比较敏感,所以希望真正知道的人回答,如果不清楚希望跟我一样等大瞎求解。

解决方案 »

  1.   

    有好多数据库语句只能操作一次就关闭了(可能与数据库设置有关,具体不太清楚)
    所以每次对数据库进行操作都要重新连接数据库,然后关闭。
    也即:
          数据库连接
              dosomething(只能是一条语句)
          数据库连接关闭      数据库连接
              dosomething(只能是一条语句)
          数据库连接关闭
              
      

  2.   

    两个规律建议遵照:
    ◎ 把获取连接与关闭连接,放在同一个地方完成(谁打开谁负责);从你的代码来看似乎不是,这样产生问题的不可控因素就多了,你要假设系统并不是只有你一个人在开发,别人写的代码中间出现Exception了,你的cleanup还能确保一定执行么?别人的代码风格必然跟你一样么?以后寻找连接泄漏的地方,容易找么?
    ◎ 连接的获取与连接的关闭,中间的代码尽量简短,要比迷你超短裙还要短;在你的代码来看似乎也不是,长期占有一个连接,然后还在函数中跳来跳去的,风险很高。总的来说,个体优秀的代码风格,不能保证系统健壮性,Cowboy永远存在。因此,必须强调结构设计的合理性。
      

  3.   


    很有意思,我几乎没看到过有设计是将数据库连接设置为全局静态。这种做法只有一种理由:池。但我没感觉你是个池。
    那么你使用全局静态的数据库连接,实际上为系统并发执行带来了非常非常多的不稳定因素。
    有多个线程的情况下,如何保证前一个关闭掉了后一个线程还能正常使用?你如何协调它们谁关闭谁打开不要产生冲突?如何协调他们不要同时执行SQL语句?你能介绍下,你将数据库连接设置为全局静态的“原始出发点”么?
      

  4.   

    全局的没关系。
    静态的在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循环外部。也不能内部只有一次连接关闭操作。就是说,必须一次操作,就连接一次。
    至于说具体问题,我表示我逃跑了,哈哈        
             
      

  5.   

    多谢,学到不少,可能我对静态不是很了解,我只想在new这个类时就创建连接,因为我肯定会用到数据连接,且肯定两个方法都会使用。就是因为这方便不是很了解怕存在问题所以求教了,呵呵。
      

  6.   


    这个我知道,我开启连接,也只做了一次insert  其他是查询,应该没事。
      

  7.   

    假定你是个Web环境的程序,同时有两个用户请求你的程序。你能设想你程序应该怎么执行,才能避免第一个用户执行到 finally {db.cleanup();} 的时候要等等第二个用户先把之前的SQL执行完?此外,由于你的数据库连接是在new这个对象的时候就连接的,那么当执行过一次db.cleanup()后,第三个用户再请求你的程序的时候,你通过什么机制去打开这个连接?总的来说,作为良好的模块化程序设计而言,不建议你用这样的设计结构。
      

  8.   

    我在全局里面创建了一个数据库连接,程序中每次使用这个类时,两个方法都是调用,而且都是先调用一,再调用二。然后我在方法二中把数据库连接关闭 db.cleanup();方法,我想知道这样做有没有问题
    真想砸你一砖头,非要哥看看你的大作不可
    自己明明说了每次调用都是两个方法都调用,然后在方法二中关闭
    大神呢,数据库是一次打开永远使用,用完了再关的东西吗?你查询完了,就自己关闭。然后再打开一个。
    两个方法之间要有先关闭后打开的操作
    没地说,伤心。
    我都给你说的这么清楚了,非要我看看你的源码?你的源码是美女吗?