如何提高访问数据库的效率

szkxy 2002-09-18 11:09:27
我写了一个Java Bean(sqlBean),里面封装了操作数据库的方法.
当我的JSP页面或其它的Bean要操作数据库时就调用sqlBean,但我现在知道数据池这个东东,据说可以提高效率,我能否修改我的sqlBean来达到目的?在我调用了sqlBean之后,是否应该让连接释放?
...全文
84 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
advanced 2002-09-18
  • 打赏
  • 举报
回复

/**
* 从给定的 ResultSet 里按指定的 properties 读出数据填写到给定的 object 中。<br>
* 根据 obj 中 property 的数据类型决定读取数据时所使用的类型。<br>
* 现在支持的数据类型包括 int、long、boolean、float、double、String、sql.Timestamp、sql.Date、sql.Time、util.Date<br>
* NOTE: 要求 object 中 property 的名字与结果集中的字段名一致。<br>
* HINT: 结果集中的字段名是 case-insensitive 的,而 bean object 是 case-sensitive 的<br>
*/
protected void readObjectFromResultSet(ResultSet rs, Object obj, String[] props) throws SQLException {
for (int i=0; i<props.length; i++) {
Object value = null;
Class theClass = null;
try {
theClass = PropertyUtils.getPropertyType(obj, props[i]);

if (theClass.getName().equals("int")) {
value = new Integer(rs.getInt(props[i]));

} else if (theClass.getName().equals("long")) {
value = new Long(rs.getLong(props[i]));

} else if (theClass.getName().equals("boolean")) {
value = new Boolean(rs.getBoolean(props[i]));

} else if (theClass.getName().equals("float")) {
value = new Float(rs.getFloat(props[i]));

} else if (theClass.getName().equals("double")) {
value = new Double(rs.getDouble(props[i]));

} else if (Class.forName("java.lang.String").isAssignableFrom(theClass)) {
value = rs.getString(props[i]);

} else if (Class.forName("java.sql.Timestamp").isAssignableFrom(theClass)) {
value = rs.getTimestamp(props[i]);

} else if (Class.forName("java.sql.Date").isAssignableFrom(theClass)) {
value = rs.getDate(props[i]);

} else if (Class.forName("java.sql.Time").isAssignableFrom(theClass)) {
value = rs.getTime(props[i]);

} else if (Class.forName("java.util.Date").isAssignableFrom(theClass)) {
Timestamp t = rs.getTimestamp(props[i]);
if (t==null)
value = null;
else
value = new java.util.Date(t.getTime());

} else {
throw new Exception("un-supported class : " + theClass.getName());
}
} catch (Exception e) {
String msg = getClass().getName() + "::BaseDAO::readObjectFromResultSet - can not read property named [" + props[i] + "] - " + e.getMessage();
Debug.error(msg);
throw new SQLException(msg);
}

try {
if (value!=null) PropertyUtils.setProperty(obj, props[i], value);
} catch (Exception e) {
String msg = getClass().getName() + "::BaseDAO::readObjectFromResultSet - no property named [" + props[i] + "] in obj can be write";
Debug.error(msg);
throw new SQLException(msg);
}
}
}

}
advanced 2002-09-18
  • 打赏
  • 举报
回复
连接池可以提高效率。在你的Bean里面应该考虑连接释放的问题,参考下面代码:
package com.nordsan.tfcrm.util;

import java.sql.*;
import java.util.*;
import java.io.UnsupportedEncodingException;
import org.apache.struts.util.*;

/** 作为 DAO 的基类,主要提供对数据库连接的管理,同时提供其它一些方便使用的工具方法。<p>
* 用 openConnection() 建立连接,可以选择以事务处理的方式建立连接。<br>
* 用 closeConnection() 关闭连接。若调用者(派生类)错过了 closeConnection(),
* 在 JavaVM 进行垃圾回收(Garbage Collection)时,会自动调用 closeConnection()。
* closeConnection() 可以重复调用。<p>
* 关闭连接时有以下几种情况:<br>
* <li>如果没有事务处理,则直接关闭;<br>
* <li>如果有事务处理,显示调用 closeConnection() 时,内部会首先自动调用 commit();<br>
* <li>如果有事务处理,而又错过了 closeConnection(),当垃圾回收而自动调用 closeConnection()
* 时,内部会首先自动调用 rollback();<p>
* 建议:派生类中一定要保证显示调用 closeConnection(),这样可以及时释放 connection 资源。
* 如果等垃圾回收时自动调用,就会对 connection 多占用一段时间,而这段时间是不能预知的。<p>
* 注意:如果启用了事务处理,在显示调用 closeConnection() 时,尤其是在 catch block 中,要
* 注意是否需要先 rollback(),因为默认的是 commit()。
*/
public class BaseDAO {
static Vector connectionLog = new Vector();

private Driver myDriver = null;
protected Connection conn = null;

public BaseDAO() {
try {
myDriver = (Driver)Class.forName("org.gjt.mm.mysql.Driver").newInstance();
} catch (Exception e){
Debug.error(getClass().getName() + "::BaseDAO() - can not initiate DB driver. " + e.getMessage());
}
}

protected void finalize() throws Throwable {
try {
if (conn != null) {
// 从 DAO 记录中去掉自己
synchronized (connectionLog) {
String daoID = toString();
if (connectionLog.contains(daoID)) {
connectionLog.remove(connectionLog.indexOf(daoID));
} else {
Debug.debug("!!!! connectionLog does not contains " + daoID + " when finalize() !!!!");
}
}

// 若 closeConnection() 未被主动调用,则先完成 rollback 操作
if (!conn.getAutoCommit()) conn.rollback();

// 提示这个 DAO 在释放之前没有主动关闭连接。
// 这是个不应该出现的现象,如果出现,说明源程序不够严密,需要修改。
Debug.debug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
Debug.debug(getClass().getName() + "::BaseDAO::finalize() - !!!! missing closeConnection() !!!!");

conn.setAutoCommit(true);

conn.close();
}
conn = null;
} catch (SQLException e){
Debug.error(getClass().getName() + "::BaseDAO::finalize() - [" + e.getErrorCode() + "] " + e.getMessage());
}
}

/** 建立连接。不启用事务处理。 */
protected void openConnection() throws SQLException {
openConnection(false);
}

/** 建立连接。可以选择是否启用事务处理。 */
protected void openConnection(boolean transaction) throws SQLException {
synchronized (connectionLog) {
// 把自己加入 DAO 记录
String daoID = toString();
if (connectionLog.contains(daoID)) {
Debug.debug("!!!! connectionLog already contains " + daoID + " when openConnection() !!!!");
} else {
connectionLog.add(daoID);
}
}

try {
if (conn == null)
conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=tts&password=tte");

if (transaction) {
conn.setAutoCommit(false);
} else {
conn.setAutoCommit(true);
}
} catch (SQLException e){
// 如果不能正常建立数据库连接,最可能的原因是连接数不够。
// 此处显示所有仍然占据连接的 DAO 记录,供调试。
for (int i=0; i<connectionLog.size(); i++) {
Debug.debug("DAO - " + connectionLog.get(i));
}

// 强制进行垃圾回收,用于暂时解决某些 DAO 释放前没有关闭连接的问题。
// 如果没有 DAO 有此类错误,则此处不必如此。
System.gc();

String msg = getClass().getName() + "::BaseDAO::openConnection() - Exception - [" + e.getErrorCode() + "] " + e.getMessage();
Debug.error(msg);

throw new SQLException(msg);
}

if (conn == null) {
String msg = getClass().getName() + "::BaseDAO::openConnection() - can not get a connection.";
Debug.error(msg);
throw new SQLException(msg);
}
}

/** 关闭连接。如果启用了事务处理,关闭前默认调用 commit()。 */
protected void closeConnection() {
// 从 DAO 记录中去掉自己
synchronized (connectionLog) {
String daoID = toString();
if (connectionLog.contains(daoID)) {
connectionLog.remove(connectionLog.indexOf(daoID));
} else {
Debug.debug("!!!! connectionLog does not contains " + daoID + " when closeConnection() !!!!");
}
}

try {
if (conn != null) {
// 若 closeConnection() 被主动调用,则先完成 Commit 操作
if (!conn.getAutoCommit()) conn.commit();

conn.setAutoCommit(true);

conn.close();
}
conn = null;
} catch (SQLException e){
String msg = getClass().getName() + "::BaseDAO::closeConnection() - " + e.getMessage();
Debug.error(msg);
}
}

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧