首先今天和以前经常会碰到一个问题就是连接数过多,通常是没有及时关闭数据库连接导致的。
如果是jsp+mysql直接写的代码那么直接在数据库连接代码+操作之后添加如下代码即可完成:
try{
if(result != null){
result.close();
result = null;
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(ps != null){
ps.close();
ps = null;
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(conn != null){
conn.close();
conn = null;
}
}catch(SQLException e){
e.printStackTrace();
}finally{
return "数据库连接已关闭";
}
}
}
但是问题是MVC设计模式在数据库的基类中我们将rs的值返回给Dao类,那么如果关闭rs那么返回的值也就为空了
下面是修改,由于修改数据库,所以不需要用的Dao,可以直接关闭
public DB(){
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("加载数据库驱动失败");
e.printStackTrace();
}
}
public void createCon(){
try {
conn=DriverManager.getConnection(url,use,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("获取数据库连接失败");
e.printStackTrace();
}
}
public void getStm(){
createCon();
try {
stm=conn.createStatement();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("创建Statement对象失败!");
e.printStackTrace();
}
}
public void executeUpdate(String sql){
getStm();
try {
stm.executeUpdate(sql);
stm.close();//关闭数据库连接
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("更新失败");
e.printStackTrace();
}
}
但是如果是查询数据库,那就麻烦了
public ResultSet executeQuery(String sql){
ResultSet rs=null;
getStm();
try {
rs=stm.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
可以看出这里查询数据库的rs肯定不能rs.close()要不返回的值就为空了
几种解决方法:
1,增加数据库连接,治标不治本
2,详细扩展查询类,根据每一个beans各自写一个,这样把值存在list里面,返回list,自然就可以关闭了,但是必须大幅度修改之前的结构
3,添加如下的类,这样在其他类调用查询时,先自己关闭rs(在那个类里面已经用过rs,自然可以关闭了,然后调用connection.closeDB())
public void closeDB(){
if (stm!=null)
try {
stm.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
经过这样处理,效果显著,当然不管怎么样,关键都是及时关闭数据库连接,开启一个宝贵的连接的时候一定要顺手写上close...