根据一位达人的代码修改的,欢迎大家讨论,并提出更好的建议!
另外,我之前发过一个帖子,同样是关于数据库连接的,我发布到服务器上后(服务器上配置了若干个网站,使用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]