/************这是自己写的数据库连接类中的一个方法***************/
public static Connection getConn(){
try{
Class.forName(DRIVER);
Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
return conn;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/***************************/
问题:因为这个方法是静态的,是不是一旦获取连接实例conn,就不能关闭它(conn),因为下一次调用getConn(){方法时,
不会再创建conn。我说的对么?为什么呢?
public static Connection getConn(){
try{
Class.forName(DRIVER);
Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
return conn;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/***************************/
问题:因为这个方法是静态的,是不是一旦获取连接实例conn,就不能关闭它(conn),因为下一次调用getConn(){方法时,
不会再创建conn。我说的对么?为什么呢?
解决方案 »
- 如何翻页、、急急急
- 急:mondrian严重问题?
- jndi 操作 ldap 出现异常
- 请教 jdom如何对2个相同元素名的属性分别读取,设置其中的值??
- Invalid <url-pattern> Test in servlet mapping
- Axis Service和Weblogic Service 哪个更有优势?
- 项目计划怎么写?怎么定了个项目计划的具体时间,但实际做起来,却比这个时间要长,不能按计划的时间来完成,这其中有哪些方面考虑不对和
- java是从main函数开始执行的么
- 用java如何判断一个字符串由单词组成?谢谢了
- tomcat 怎么安装
- 一个servlet,能够在网页上显示一个计时器,精确到秒
- 帮忙把下面的代码翻译成java代码,原来是perl
先不谈高级的运动比如数据库连接池之类。 一般获取类这里是用静态方法就使用单例模式。 你这里每次调用getConnection 都要去重新生成数据库链接,每次都要去加载驱动。所以消耗性能比较大。建议你这样写
private static Connection conn = null;public static Connection getConn(){
try{
if(conn == null){ //这样的话 如果conn里不为空则直接返回链接对象 而不需要再次去装载驱动并实例化Connection
Class.forName(DRIVER);
conn= DriverManager.getConnection(URL,USERNAME,PASSWORD);
}
return conn;
}catch(Exception e){
e.printStackTrace();
return null;
}
}这个是基本的写法,你还是学生吧。
言之差异。 这里说的基本写法是指公司开发的最基本的写法。和学校里学的基本写法不是一个层次的理念。学校学到的只是如何去实现功能。 而现实公司的要求是不光要实现功能还要讲究怎么样才能提高效率。可以说我上面提供的那个写法比你原始的写法效率能提高N倍。我那个基本写法是指Java23种设计模式里单例模式的基本写法。你如果毕业后从事Java开发工作的话。 这个模式不管在面试还是笔试90%会考到。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class DBManager { private static DBManager dbm = null;
// 用户名 private String user = ""; // 密码 private String password = ""; // 主机 private String host = ""; // 数据库名字 private String database = ""; // private DBManager dbm=null; /*
*
* private String
* url="jdbc:mysql://"+host+"/"+"useUnicode=true&characterEncoding=GB2312";
*/ private String url = ""; private Connection con = null; Statement stmt; /**
*
* 私有的构造方法,确保外部不能实例化,只能由DBManager自己能提供自
*
* 己的实例,并且只能有一个。
*
* 根据主机、数据库名称、数据库用户名、数据库用户密码取得连接。
*
* @param host
* String
*
* @param database
* String
*
* @param user
* String
*
* @param password
* String
*/ private DBManager(String host, String database, String user, String password) { this.host = host; this.database = database; this.user = user; this.password = password; // 显示中文 this.url = "jdbc:mysql://" + host + "/" + database + "?useUnicode=true&characterEncoding=GB2312"; try { Class.forName("org.gjt.mm.mysql.Driver"); } catch (ClassNotFoundException e) { System.err.println("class not found:" + e.getMessage()); } try { con = DriverManager.getConnection(this.url, this.user,
this.password); // 连接类型为ResultSet.TYPE_SCROLL_INSENSITIVE,
// ResultSet.CONCUR_READ_ONLY stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); } catch (SQLException a) { System.err.println("sql exception:" + a.getMessage()); } } /**
*
* 静态工厂方法,来获得一个DBManager实例
*/ public static DBManager getInstance(String host, String database,
String user, String password) { if (dbm == null) { dbm = new DBManager(host, database, user, password); } return dbm; } /**
*
* 返回取得的连接
*/ public Connection getCon() { return con; } /**
*
* 执行一条简单的查询语句
*
* 返回取得的结果集
*/ public ResultSet executeQuery(String sql) { ResultSet rs = null; try { rs = stmt.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } /**
*
* 执行一条简单的更新语句
*
* 执行成功则返回true
*/ public boolean executeUpdate(String sql) { boolean v = false; try { v = stmt.executeUpdate(sql) > 0 ? true : false; } catch (SQLException e) { e.printStackTrace(); } finally { return v; } }}
方法只会调用一次,意思就是说只能得到一个con,所以我认为不能关闭con,对么?