我写了一个关于数据库连接池的一个简单类,用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();
}
}
}
}
代码类似下面的简单例子
我用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();
}
}
}
}
解决方案 »
- java客户端调用webservice时候,服务端通过spring注入的对象为空,怎么解决吖
- java网络编程
- 想学hibernate,请大家推荐比较好的书,能从基础学习的那种
- 关于把数据集的记录插到表里去
- 高分求救Hibernate中不能更新数据的问题(100)
- 小问题,放100分,其实就是散分!
- 关于下拉菜单里选择一个特定的值后在页面上显示该值和该值下面的文本框里对应的内容问题---万分感激!
- 毕业设计最终发行版!请各界朋友参与最终的测试!
- 请教一个servlet的问题
- 会asp的大虾请拔刀相助
- 关于Conn cannot be resolved to a type
- jsp系统中,有个固定的时间字符串数组,每当打开网页的一个报表时都需要用到,怎么处理效率最高?
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; }}