⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datasourceimpl.java

📁 用java写一个线程池的例子,值得一看.
💻 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 + -