我写了一个关于数据库连接池的一个简单类,用List 装了15 个Connection  
代码类似下面的简单例子
 我用Iterator 迭代的时候抛出java.util.ConcurrentModificationException异常,
后来我改用普通 的for 循环,不再出现此种情况,但会不会出现潜在的线程问题?
下面 是改后的代码
package utils;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;
import java.util.List;public class DBUtils {
private static DBUtils instance = new DBUtils(); static List<Connection> conns = new ArrayList<Connection>(); static {
init(); }
//初始化十五个connection 放入list 中
private static void init() {
// 向 conns加入15个 connection
Connection conn = null; try {
Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) {
e.printStackTrace();
} for (int i = 0; i < 15; i++) {
try {
conn = DriverManager
.getConnection("jdbc:mysql://localhost:3307/bbs?user=root&password=root"); } catch (SQLException e) {
e.printStackTrace();
}
conns.add(conn);
}
} public static DBUtils getInstance() {
return instance;
} public Connection getConn() {
Connection conn = null; for (int i = 0; i < conns.size(); i++) { conn = conns.get(0); try {
if (conn == null || conn.isClosed()) {// 如果,移除此关闭的连接,并重新加入一个连接;
conns.remove(conn);// 移除已关闭的联结
                                               //
closeConnActually(conn);
conn = DriverManager
.getConnection("jdbc:mysql://localhost:3307/bbs?user=root&password=root");
conns.add(conn); } else { // 否则,此连接未被关闭则 conns.remove(conn);
return conn; }
} catch (SQLException e) {
e.printStackTrace();
} }
init(); return getConn(); }
 
 
 //把conn 重新放回conns(List) 中//并未真正关闭
public void close(Connection conn) {
if (conn != null) {
try {
if (!conn.isClosed()) {
// 将此连接重新放入conns 以备重用
conns.add(conn);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//真正关闭一个连接 
public void closeConnActually(Connection conn) {
if (conn != null) {
try {
if (!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}  
 
 }

解决方案 »

  1.   

     for (int i = 0; i < conns.size(); i++) {            conn = conns.get(0);            try {
                    if (conn == null || conn.isClosed()) {// 如果,移除此关闭的连接,并重新加入一个连接;
                        conns.remove(conn);// 移除已关闭的联结
                                                   //
                        closeConnActually(conn);
                        conn = DriverManager
                                .getConnection("jdbc:mysql://localhost:3307/bbs?user=root&password=root");
                        conns.add(conn);                } else { // 否则,此连接未被关闭则                    conns.remove(conn);
                        return conn;                }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
    ===============================================原来的代码大概是\
    for(Iterator it = lists.iterator();it.next;){
    conn=it.next();
      if (conn == null || conn.isClosed()) {// 如果,移除此关闭的连接,并重新加入一个连接;
                        conns.remove(conn);// 移除已关闭的联结
                                                   //
                        closeConnActually(conn);
                        conn = DriverManager
                                .getConnection("jdbc:mysql://localhost:3307/bbs?user=root&password=root");
                        conns.add(conn);                } else { // 否则,此连接未被关闭则                    conns.remove(conn);
                        return conn;                }}