/*
*得到数据库连接
*/
public synchronized Connection getConnection() throws SQLException {
// TODO Auto-generated method stub
if (!availableConnections.isEmpty())
{
Connection existingConnection =
(Connection)availableConnections.lastElement();
int lastIndex = availableConnections.size() - 1;
availableConnections.removeElementAt(lastIndex);
if (existingConnection.isClosed())
{
notifyAll(); // Freed up a spot for anybody waiting
return(getConnection());
}
else
{
busyConnections.addElement(existingConnection);
//System.out.println("ORACLE connPool["+Thread.currentThread().getName()+" got connection("+existingConnection.hashCode()+")]");
return(existingConnection);
}
}
else
{
if ((totalConnections() < maxConnections) && !connectionPending)
{
makeBackgroundConnection();
}
else if (!waitIfBusy)
{
throw new SQLException("Connection limit reached");
}
// Wait for either a new connection to be established
// (if you called makeBackgroundConnection) or for
// an existing connection to be freed up.
try
{
//find bug
while(availableConnections.isEmpty()){
wait();
}
}
catch(InterruptedException ie)
{}
// Someone freed up a connection, so try again.
return(getConnection());
}
}
public synchronized void free(Connection conn) {
// TODO Auto-generated method stub
busyConnections.removeElement(conn);
availableConnections.addElement(conn);
// Wake up threads that are waiting for a connection
notifyAll();
}
public synchronized void setMaxConnectionNumber(int maxlen) {
// TODO Auto-generated method stub
if (maxlen <= availableConnections.size())
return ;
this.maxConnections = maxlen ;
}
public synchronized void close() {
// TODO Auto-generated method stub
closeConnections (availableConnections);
availableConnections = new Vector<Connection>();
closeConnections (busyConnections);
busyConnections = new Vector<Connection>();
}
/*
*关闭一个连接向量中的所有连接
*/
private void closeConnections(Vector<Connection> connections)
{
try
{
for(int i=0; i<connections.size(); i++)
{
Connection connection =
(Connection)connections.elementAt(i);
if (!connection.isClosed())
{
connection.close();
}
}
}
catch(SQLException sqle)
{
// Ignore errors; garbage collect anyhow
// 不处理错误,让垃圾回收处理
}
}
/*
*ConnectPool对象的字符串描述
*/
public synchronized String toString()
{
String info =
"ConnectionPool(" + url + "," + username + ")" +
", available=" + availableConnections.size() +
", busy=" + busyConnections.size() +
", max=" + maxConnections+
", code=" + hashCode();
return(info);
}
}
分享到:
相关推荐
而JDBC(Java Database Connectivity)是Java中用于与数据库交互的API,JDBC连接池(如JDBCPool)则是管理数据库连接的一种高效机制。 在这个"struts+jdbcpool实例"中,开发者使用Struts作为前端控制器,处理用户...
JDBC连接池 原子性:最小的单元,如果一个是失败了,则一切的操作将全部失败。 一致性:如果事务出现错误,则回到最原始的状态 隔离性:多个事务之间无法访问,只有当事务完成后才可以看到结果 持久性:当一个...
Tomcat 7 的 新数据源配置方式,context.xml 配置了一个性能优秀的数据源,数据库的账号,密码和url需要根据自己的项目实际情况来修改
本篇文章将对比分析四个常见的Java连接池实现:C3P0、Proxool、Druid和Tomcat JDBC Pool,以帮助开发者选择最适合项目需求的解决方案。 1. C3P0 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3...
java中c3p0数据库连接池使用方法(c3p0-config.xml+c3p0-0.9.2-pre1.jar+JdbcPool_c3p0.java),里面包含了c3p0-0.9.2-pre1.jar、以及配置文件:c3p0-config.xml、以及一个c3p0数据库连接池工具类(只有简单的两个方法...
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
NULL 博文链接:https://jackyin5918.iteye.com/blog/1922379
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用