📄 datasourceimpl.java
字号:
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2008-1-10
* Time: 16:32:32
* To change this template use Options | File Templates.
*/
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.sql.Driver;
import java.util.Iterator;
import java.util.Vector;
import java.io.PrintWriter;
public class DataSourceImpl implements DataSource {
private ConnectionParam connParam = null ;
private PrintWriter _logWriter = null ;
private Vector conns =null ;
public DataSourceImpl(ConnectionParam lsParams) {
super();
connParam = lsParams ;
conns = new Vector() ;
}
public void initConnection() throws Exception {
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch(Exception ex)
{
throw new Exception("请求的数据库驱动不存在!");
}
}
public Connection getConnection() throws SQLException{
return null ;
}
/**
* @see javax.sql.DataSource#getConnection(String,String)
*/
public Connection getConnection(String user, String password) throws SQLException
{
//首先从连接池中找出空闲的对象
Connection conn = getFreeConnection(0);
if(conn == null){
//判断是否超过最大连接数,如果超过最大连接数
//则等待一定时间查看是否有空闲连接,否则抛出异常告诉用户无可用连接
if(getConnectionCount() >= connParam.getMaxConnection())
conn = getFreeConnection(connParam.getWaitTime());
else{//没有超过连接数,重新获取一个数据库的连接
connParam.setUser(user);
connParam.setPassword(password);
Connection conn2 = DriverManager.getConnection(connParam.getUrl(),
user, password);
//代理将要返回的连接对象
_Connection _conn = new _Connection(conn2,true);
synchronized(conns){
conns.add(_conn);
}
conn = _conn.getConnection();
}
}
return conn;
}
/**
* 从连接池中取一个空闲的连接
* @param nTimeout 如果该参数值为0则没有连接时只是返回一个null
* 否则的话等待nTimeout毫秒看是否还有空闲连接,如果没有抛出异常
* @return Connection
* @throws SQLException
*/
protected synchronized Connection getFreeConnection(long nTimeout)
throws SQLException
{
Connection conn = null;
Iterator iter = conns.iterator();
while(iter.hasNext()){
_Connection _conn = (_Connection)iter.next();
if(!_conn.isInUse()){
conn = _conn.getConnection();
_conn.setInUse(true);
break;
}
}
if(conn == null && nTimeout > 0){
//等待nTimeout毫秒以便看是否有空闲连接
try{
Thread.sleep(nTimeout);
}catch(Exception e){}
conn = getFreeConnection(0);
if(conn == null)
throw new SQLException("没有可用的数据库连接");
}
return conn;
}
/**
* 关闭该连接池中的所有数据库连接
* @return int 返回被关闭连接的个数
* @throws SQLException
*/
public int close() throws SQLException
{
int cc = 0;
SQLException excp = null;
Iterator iter = conns.iterator();
while(iter.hasNext()){
try{
((_Connection)iter.next()).close();
cc ++;
}catch(Exception e){
if(e instanceof SQLException)
excp = (SQLException)e;
}
}
if(excp != null)
throw excp;
return cc;
}
public int getConnectionCount(){
return conns.size();
}
public void stop(){
}
public void setLoginTimeout(int seconds) {
throw new UnsupportedOperationException();
}
protected PrintWriter logWriter = new PrintWriter(System.out);
public int getLoginTimeout() {
throw new UnsupportedOperationException();
}
public void setLogWriter(PrintWriter out) {
_logWriter = out ;
}
public PrintWriter getLogWriter() {
return _logWriter;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -