【分享&讨论】一个简单的数据库连接池的实现

lizhenyang 2009-11-23 11:01:42
根据一位达人的代码修改的,欢迎大家讨论,并提出更好的建议!
另外,我之前发过一个帖子,同样是关于数据库连接的,我发布到服务器上后(服务器上配置了若干个网站,使用Apache2 + Tomcat5 + mod_jk + JDK1.6搭建),间歇性地出现数据库连接错误,至今未解决,不知怎么回事,感兴趣的去看看吧,希望能帮忙解决,谢谢。
帖子地址:http://topic.csdn.net/u/20090612/14/f2919d18-d422-4a5d-9a20-393b82633373.html

[Java code]
package plumleee.httpUtils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
/**
* 自定义数据库连接池的应用
* @author Softlover
*/
public final class DBPool {
private static String dbComName;
private static String className;
private static String dbHost;
private static int dbPort;
private static String dbName;
private static String dbUser;
private static String dbPswd;
private static String dbURL;
private static int maxConnNum = 20;
private Connection conns[] = new Connection[maxConnNum];
private static ArrayList connPool = new ArrayList();
private static boolean poolIsInit = false;
private static short flag = 0;
/**
* 初始化数据库连接池,默认使用 MySQL数据库
*/
public DBPool() {
dbComName = "MySQL";
className = "com.mysql.jdbc.Driver";
dbHost = "localhost";
dbPort = 3306;
dbName = "test";
dbUser = "root";
dbPswd = "toor";
dbURL = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName +"?useUnicode=true&characterEncoding=utf8";
if (!poolIsInit)
initConnPool();
}
/**
* 初始化数据库连接池
* @param db:[sqlServer | oracle | db2]
*/
public DBPool(String db) {
if ("oracle".equals(db)) {
dbComName = "Oracle";
} else if ("sqlServer".equals(db)) {
dbComName = "SQL Server";
className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
dbHost = "localhost";
dbPort = 1433;
dbName = "test";
dbUser = "sa";
dbPswd = "as";
dbURL = "jdbc:sqlserver://" + dbHost + ":" + dbPort +";DatabaseName=" + dbName + "";
} else if ("db2".equals(db)) {
dbComName = "DB2";
} else {
new DBPool();
}
if (!poolIsInit)
initConnPool();
}
/*---*/
private void initConnPool() {
for (int i = 0; i<maxConnNum; i++) {
conns[i] = getConnFromDB();
connPool.add(i, conns[i]);
}
poolIsInit = true;
}
private Connection getConnFromDB() {
try {
Class.forName(className);
return DriverManager.getConnection(dbURL, dbUser, dbPswd);
} catch (ClassNotFoundException e) {
System.out.println(dbComName + ": Database Class Not Found.");
} catch (Exception e) {
System.out.println("connect " + dbComName + " server error.");
e.printStackTrace();
}
return null;
}
/*---*/
/**
* 从连接池中获取一个数据库连接
* @return Connection
*/
public static Connection getConn() {
Connection conn = null;
if (0==connPool.size()) {
try {
java.lang.Thread.sleep(1000);
if(59 < flag++)
return null;
getConn();
} catch (InterruptedException e) {
System.out.println("DB connetion pool is out, java tread sleep error.");
}
} else {
conn = (Connection) connPool.remove(0);
}
return conn;
}
/**
* 把使用完的数据库连接放回连接池中
* @param conn:使用完的连接
* @return boolean:放回成功为 true,否则为 false
*/
public static boolean putConn(Connection conn) {
return connPool.add(conn);
}
/**
* !! 关闭一个数据库连接,使用本连接池,不需要使用此方法!
* @param conn:待关闭的数据库连接
* @return boolean:关闭成功为 true,否则为 false
*/
public static boolean close(Connection conn) {
try {
if (null!=conn && !conn.isClosed())
conn.close();
return true;
} catch (Exception e) {}
return false;
}
/**
* 查询数据库记录
* @param conn:可用的数据库连接
* @param sql:执行的SQL查询语句:select
* @return ResultSet:查询结果集
*/
public static ResultSet sqlQuery(Connection conn, String sql) {
try {
Statement st = conn.createStatement();
return st.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {}
return null;
}
/**
* 插入数据库记录,并返回自动生成的值
* @param conn:可用的数据库连接
* @param sql:执行的SQL插入语句:insert
* @return String:字符串,自动生成的值
*/
public static String sqlInsert(Connection conn, String sql) {
try {
PreparedStatement pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pst.executeUpdate(sql);
ResultSet rs = pst.getGeneratedKeys();
if (rs.next())
return rs.getString(1);
} catch (SQLException e) {
e.printStackTrace();
} finally {}
return null;
}
/**
* 更新数据库记录
* @param conn:可用的数据库连接
* @param sql:执行的SQL语句:insert、update、delete
* @return int:影响的记录条数
*/
public static int sqlUpdate(Connection conn, String sql) {
try {
PreparedStatement pst = conn.prepareStatement(sql);
return pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {}
return 0;
}
/*---*//**
public static void main(String[] args) {
;
}*/
}
[/Java code]
...全文
93 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizhenyang 2010-01-26
  • 打赏
  • 举报
回复
我新发了一篇服务器配置的文章,感兴趣的一起看一下,希望有人能帮忙解决我的问题,先谢谢啦!
http://topic.csdn.net/u/20100125/17/f5c55a16-450b-4e4a-aa25-688111ad02ed.html
仿点点网轻博客系统 v1.2源码 国内第一款开源轻博客系统,仿点点网的HaiTian.HaiKe.NET(海客),是一款免费、开源的轻博客系统,aiTian.HaiKe.NET(海客)完全遵循 W3C 标准,具有极强的可扩展性、高性能、良好的 SEO 性能和非凡的用户体验。 HaiTian.HaiKe.NET(海客) 采用 Visual Studio 2010 开发环境开发,运行环境为 .net framework 3.5/4.0+sqlserver2008 R2,保证系统的安全和稳定性。 海客轻博客,轻松分享你的兴趣。便捷的多图发布,清新文艺的个性化模板,时尚达人的聚集地,用图片记录生活的最佳选择,随地随地与好友一起,在兴趣中寻找快乐. 海客轻博客 v1.2 日期:2012-1-27更新说明 1、忘记密码的功能,用户可以通过忘记密码找回自己的账号 2、实现了后台对前台页面的控制,方面管理员对前台页面的的管理。 3、实现了转载的功能 4、实现了热度图像的绑定 5、实现了个人昵称修改时的检测 6、初步实现音乐的在线试听 7、修改了登录界面IE7下样式错位的问题。 8、添加了注册界面中的用户注册时昵称的检测 9、修改首页中我的关注鼠标划上去浮动的问题 10、修改了视频分享中的链接不支持的问题。 11、修改图片保存数据库异常的问题 12、激活页面 按钮图片修改为:立即激活 13、JS提取到单独的文件中 14、解决首页数据加载的异常 15、实现关注的功能 日期:2011-12-15 1.调整代码错误,数据库连接池爆满 2.抓取页面地址错误,优酷视频地址无法获取问题. 主要功能: 简单调用外链,输入地址可以自动搜索原视频,音频地址 发布信息简单快捷. 易于配置,使用,管理 占用硬盘空间小,运行所需内存空间少 Theming 通过CSS支配(完全支持CSS Media Types ) 自动页面备份(执行一个备份就和单击鼠标一下一样简单) 简单的用户帐户系统 (管理员和用户以及一个内置 admin 帐户) 页面可分类和讨论 页面嵌入和部分显示 阻止恶意文件,脚本,垃圾信息 (注册时需要Captcha 验证) 多语言界面 每个页面,页面上的讨论,整个WIKI均可进行RSS 2.0 验证

81,094

社区成员

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

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