数据库连接connection
java数据库连接在被创建后,当使用完后被关闭其对象并未立即销毁而只是与服务器断开,所以在写数据库的帮助类是要注意:如果获取的connection的定义是全局的,则在获取一个connection的判断时不能仅仅靠connection是否为null,这样是是很危险的,如下:
不推荐下面写法:
public class DbHelper{
ResultSet re;
Context ctx;
DataSource ds;
Connection conn;
Statement st;
/**
* <b>Summary: </b>
* 获取conn的值
* @return conn
*/
public Connection getConn() {
try {
if(conn!=null&&!conn.isClosed()){
//假如此处只判断conn!=null则在系统第一次初始化时没问题;但一旦打开依次连接并关闭后,再次获取连接时就会报错“connection is closed” 但你在 //fix这个Bug时却发现conn不为null。怎么回事,难道没关闭,实际上你已经关闭了,只是java并未销毁该对象,而只是让conn与服务器断开了连接
//所以才导致出错
//解决方法:1.在判断的地方要加上!conn.isClosed()2.再该类里的close()方法里关闭连接的后面加上conn=null(但若在获取conn后,不采用
//dbhelper对象去调用close()方法来关闭conn,而是自己手动写代码关闭的话,那么这个dbhelper对象的conn只是被关闭,仍然不为空,即使写了
//conn=null也无用,因为改变的只是你自己定义的conn的引用,而dbhelper对象自己的conn属性的引用仍然没变,所以这个方法有很大弊端)
//3.最好直接将connection定义为局部变量,每次直接获取,只不是在每次用完后必须一定要将其关闭就行了(这是最好的方法)
return conn;
}else{
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/sqlserver");
conn = ds.getConnection();
}
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public void close() {
try {
if (re != null) {
re.close();
}
st.close();
conn.close();
conn = null;//将该对象置空,放置判断出错
ctx.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
}
}
推荐下面写法:
上边将connection定义为全局的,这样造成很多麻烦,所以最好使用下面这种写法,将connection定位局部变量,每次直接获取,并保证使用后关闭就行了,这样免去了上面写法的判断麻烦
package com.zbj.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBManager {
private final String DRIVER = "com.mysql.jdbc.Driver";
private final String URL = "jdbc:mysql:///xxx";
private final String USER = "root";
private final String PASSWORD = "root";
/*
* 获得连接
*/
public Connection getConnection(){
Connection con = null;
try {
Class.forName(DRIVER);
con = DriverManager.getConnection(URL,USER,PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
/*
* close()
*/
public void close(Statement state,Connection conn){
if(state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
public void close(ResultSet rs,Statement state,Connection conn){
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
}
}

浙公网安备 33010602011771号