菜鸟之数据库连接池问题待解,请入内 说说我的看法:1、makePool()方法应该做成一个静态初始化。至少也应该是一个单实例。我感觉完全没必要实例化。2、getConn()、returnConn()方法应该是synchronized方法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 getConn()、returnConn()可以做成static的,这样就不用ConnectPool.getInstance()这样来调用了。 我对自己这段程序的进一步理解其实这样写主要就是靠static来实现连接的重用。我写这段程序是这样开始的: 创建一个连接 -> 执行sql语句(计算时间) 结果:每秒钟可以插入200条记录(1个用户) 写这个类,起先在getConn()、returnConn()也都是synchronized的方法,可是 结果:每秒钟插入数据库记录2条(1个用户) 所以我只好去掉synchronized, 结果:每秒钟插入数据库记录5条(1个用户) 天那,我的程序究竟慢在那里啊?也不应该差几十倍啊 经过继续测,其实前面打印出来的对象地址,这种情况是对的,因为用完一个conn后,再 将它返回到 collection,它已经被置入collection的尾部,所以打印出来的结果不同。 可是,速度为什么还是这么慢呢,为什么???? pool中显示总是还有多个空闲连接,可是操作速度又上不去。 唉,我先去哭吧 我认为问题主要在 public static ConnectPool getInstance(){ try{ ConnectPool cp = new ConnectPool(); 〈==============这根本不是单例模式啊 if(freeConnections.size() == 0){ makePool(); } return cp; } catch(Exception e){ e.printStackTrace(); return null; } }每次都try{}catch(){} new一个,不慢也难。 其实我是建议把getConn和returnConn做成静态方法的,不过你要这么用,就先按你的办法吧。import java.util.*;import java.sql.Connection;public class ConnectPool { private static ConnectPool cp = new ConnectPool(); private Collection freeConnections = new ArrayList(); private Collection usedConnections = new ArrayList(); private int connectionNum = 5; private int poolID = 0; private ConnectPool(){ } public synchronized Connection getConn() throws Exception { if (cp.getFreeConnections().size() == 0) { cp.makePool(); } Iterator it = cp.getFreeConnections().iterator(); if (it.hasNext()) { Connection conn = (Connection) it.next(); cp.getFreeConnections().remove(conn); cp.getUsedConnections().add(conn); return conn; } else { throw new Exception("error: not available connection from pool."); } } private java.util.Collection getFreeConnections(){ return freeConnections; } public static ConnectPool getInstance(){ if (cp == null) cp = new ConnectPool(); return cp; } private java.util.Collection getUsedConnections(){ return usedConnections; } private void makePool(){ if (getFreeConnections().size() != 0) return; for (int i = 1; i <= connectionNum; i++) { Connection conn = DBUtil.getDBConnections(DatabaseNames.PROP_FILENAME); freeConnections.add(conn); } } public synchronized void returnConn(Connection conn){ cp.getUsedConnections().remove(conn); cp.getFreeConnections().add(conn); }} Integer ir=0626; 打印出406 难道是精度丢失? 窗口关闭问题 static关键字问题 if/else程序用switch/case 代替 this.name="peny",如果name本身就为一个变量,该怎么写? 熬了一宿,终于凑够了十分,特来问个隐藏窗口的问题 如何动态得到自身的名字????????????????? junit这个东西到底有没有用啊? jbuilder在打开输入法后就死拉,如何解决? 在方法中如何使用同步语句块??? applet下载的问题 在内部网中用java mail 向NOTES服务器发邮件?(直接连NOTES)
public static ConnectPool getInstance(){
try{
ConnectPool cp = new ConnectPool(); 〈==============这根本不是单例模式啊
if(freeConnections.size() == 0){
makePool();
} return cp;
}
catch(Exception e){
e.printStackTrace();
return null;
}
}
每次都try{}catch(){} new一个,不慢也难。
import java.util.*;
import java.sql.Connection;
public class ConnectPool {
private static ConnectPool cp = new ConnectPool();
private Collection freeConnections = new ArrayList();
private Collection usedConnections = new ArrayList();
private int connectionNum = 5;
private int poolID = 0;
private ConnectPool()
{
}
public synchronized Connection getConn() throws Exception {
if (cp.getFreeConnections().size() == 0)
{
cp.makePool();
}
Iterator it = cp.getFreeConnections().iterator();
if (it.hasNext())
{
Connection conn = (Connection) it.next();
cp.getFreeConnections().remove(conn);
cp.getUsedConnections().add(conn);
return conn;
}
else
{
throw new Exception("error: not available connection from pool.");
}
}
private java.util.Collection getFreeConnections()
{
return freeConnections;
}
public static ConnectPool getInstance()
{
if (cp == null)
cp = new ConnectPool(); return cp;
}
private java.util.Collection getUsedConnections()
{
return usedConnections;
}
private void makePool()
{
if (getFreeConnections().size() != 0)
return;
for (int i = 1; i <= connectionNum; i++)
{
Connection conn = DBUtil.getDBConnections(DatabaseNames.PROP_FILENAME);
freeConnections.add(conn);
}
}
public synchronized void returnConn(Connection conn)
{
cp.getUsedConnections().remove(conn);
cp.getFreeConnections().add(conn);
}
}