参看:http://blog.csdn.net/caoyinghui1986/archive/2008/04/22/2315864.aspx
其中屏蔽close方法的部分可以用动态代理实现。lz 不妨去试下。

解决方案 »

  1.   

    tomcat下建立连接池<Context>
         <Resource name="jdbc/dbname" auth="Container" type="javax.sql.DataSource"/>     
         <ResourceParams name="jdbc/dbname">     
           <parameter>
             <name>factory</name>
             <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
           </parameter> 
           <parameter>
             <name>maxActive</name>
             <value>10</value>
           </parameter> 
           <parameter>
             <name>maxIdle</name>
             <value>30</value>
           </parameter> 
           <parameter>
             <name>maxWait</name>
             <value>10000</value>
           </parameter>     
           <parameter>
            <name>username</name>
            <value>oa</value>
           </parameter>    
           <parameter>
            <name>password</name>
            <value>oa</value>
           </parameter>    
           <parameter>
              <name>driverClassName</name>
              <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
           </parameter>       
           <parameter>
             <name>url</name>
             <value>jdbc:microsoft:sqlserver://192.168.1.84:1433;DatabaseName=dbnmae;SelectMethod=cursor</value>
           </parameter>
         </ResourceParams>
            </Context>
      

  2.   

    这个实现的方式太多了很难说,要看楼主现在的水平,spring的依赖注入是个不错的选择
      

  3.   

    连接池源码前提是导入spring框架,我用的是jtds驱动,所以还需要jtds的驱动包 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <property name="url" value="jdbc:jtds:sqlserver://localhost:1433;databasename=auction"></property>
    <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"></property>
    <property name="maxIdle" value="60"></property>
    <property name="maxWait" value="5000"></property>
    <property name="username" value="sa"></property>
    <property name="password" value=""></property>
    <property name="maxActive" value="500"></property>
    <property name="defaultAutoCommit" value="true"></property>
    <property name="removeAbandonedTimeout" value="60"></property>

    </bean>
      

  4.   

    连接池有很多如apache的BasicDataSource或者c3p0等,楼主可以根据需要选择合适的连接池,自己开发也行。
    一般情况下连接池都需要提供url,driverClass等数据库联接的属性。
    还需要为连接池设置最大连接数目最小连接数等属性。在程序中可以通过JNDI来使用连接池:
    ctx = new InitialContext();
    Context envctx = (Context) ctx.lookup("java:comp/env");   
    DataSource ds = (DataSource) envctx.lookup("jdbc/TestDB");   
    Connection conn=ds.getConnection();Spring配置参考:
    <bean id = "dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
    <value>java:comp/env/jdbc/TestDB</value>
    </property>
    </bean>hibernate配置参考:
    <session-factory>
    <property name="connection.datasource">
        java:comp/env/jdbc/TestDB
    </property>
            ......
    </session-factory>
      

  5.   

    如果考虑到性能问题最好去用一些成熟的产品,
    但是如果楼主想自己练习一下的话也能自己开发一个,数据库连接池无非就是"缓存多个数据库连接,然后通过ConnectionsManager(指代你编写的数据库连接池管理类)进行分配连接和回收连接",里面一些性能优化还得看楼主自己的水平,如何合理地分配连接,等连接数不足的时候要采取什么策略,回收连接后,如果空闲连接太多要如何处理,主要还有缓存方面的处理,如果缓存方面处理得好的话对性能有大的提高的
      

  6.   

    依照服务器的不同而有所不同,一般用console里的connection pools按照步骤操作就可以,别忘记了把对应数据库的驱动程序放到相应的位置,不然建立不成功。成功以后,你可以看看它的原码怎么写的,以后直接写入就可以了,用editplus编辑,那样比较保险。我用的是weblogic,具体可以见
    http://database.51cto.com/art/200512/12788.htm
      

  7.   

    下面是我的一个程序,主要用于java应用程序和JSP中。import java.io.*;
    import java.sql.*;
    import java.util.*;/**
     *  建立一个数据库连接池,用于提供和回收数据库连接。<p>
     *  建立连接池的目的,一是为了代码复用,而是为了避免频繁的创建释放数据库连接。<p>
     *  public static synchronized DBConnectionPool getInstance()<p>
     *  返回惟一实例,如果是第一次调用此方法,则创建该实例.<p>
     *  public synchronized void freeConnection(Connection con)<p>
     *  将不再使用的连接返回给连接池.<p>
     *  public synchronized Connection getConnection()<p>
     *  从连接池申请一个可用连接。如没有空闲的连接且当前连接数小于最大连接数的限制,则创建新的连接.
     * @author shi_xiaoping
     *  Start Time:2008-3-28
     */public class DBConnectionPool {
    private int minConn=1; //最小连接数
    private int maxConn=3; //最大连接数

    private String driver="";
    private String url="";
    private String user="";
    private String password="";

    private String logFile="log\\dbpool";//日志文件
    private PrintWriter loger=null;

    private int connAmount=0;
    private Stack<Connection> connStack=new Stack<Connection>(); //使用STACK来保存数据库连接
    private static DBConnectionPool instance=null;


    /**  
     * 返回惟一实例,如果是第一次调用此方法,则创建该实例.
     */
    public static synchronized DBConnectionPool getInstance(){
    if(instance==null){
             instance=new DBConnectionPool(); 
    }
    return instance;  
    }


    private DBConnectionPool(){
    //读取数据库属性文件
    getProperty();

    try{
    /*
    File file=new File(logFile);
    if(file.exists()&&file.isFile()){
                file.delete();//删除旧日志
    }
    file.createNewFile();//常见新日志
    */
    //创建新日志文件名称
    Calendar rightNow = Calendar.getInstance();
    String appendString=MyCalendar.dateToString(rightNow);
    if(appendString!=null){
    logFile=logFile+appendString+".log";
    }
    loger=new PrintWriter(new FileWriter(logFile,true),true);
    }catch(IOException ioe){
    System.err.println("无法日记文件:"+ioe.getMessage());
    loger=new PrintWriter(System.err);
    }

    //注册驱动程序
    try{
    //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    Class.forName(driver);
    log("成功注册驱动程序");    
    }catch(Exception e){
    log("无法注册驱动程序"); 

        
    //根据最少连接数生成连接
    for(int i=0;i<minConn;i++){
    connStack.push(newConnection());

    }


    /**
     * 从连接池申请一个可用连接。如没有空闲的连接且当前连接数小于最大连接数<p>
     *  的限制,则创建新的连接.
     */
    public synchronized Connection getConnection(){
    Connection con=null;
    log("从连接池申请一个连接");
    log("现在可用的连接总数为:"+connStack.size());

    if(!connStack.empty()){
    //获取一个可用的连接
    con=(Connection)connStack.pop();
    }else if(connAmount<maxConn){
    con=newConnection();      
    }
    else{
    try{
    log("等待连接");
         wait(10000);
         return getConnection();           
    }catch(InterruptedException ie){
    //用户等待
    }  
    }

    return con;    
    }


    /**
     * 将不再使用的连接返回给连接池.
     */  
    public synchronized void freeConnection(Connection con){
    connStack.push(con);        //将指定连接入栈
      notifyAll();                //唤醒正在等待连接的进程
      log("归还一个连接到连接池"); 
    }



    /**
         * 创建新的连接
         */
    private Connection newConnection(){
    Connection con=null;
    try{
    con=DriverManager.getConnection(url,user,password);
         connAmount++;
            log("连接了创建一个新的连接");
      }catch(SQLException e){
            log("无法创建下列url的连接:"+e.getMessage());
            return null;
    }
        return con;
    }


    /**
     * 将文本信息写入日志文件
     */
    private void log(String msg){   
    loger.println(new java.util.Date()+":"+msg);    
    }


    /**
     * 读取数据库属性配置文件datebase.properties
     */
    private void getProperty() {
    Properties prop = new Properties();
    try {
    FileInputStream in = new FileInputStream("datebase.properties");
    prop.load(in);
    driver = prop.getProperty("driver");
    url = prop.getProperty("url");
    user = prop.getProperty("user");
    password = prop.getProperty("password");
    }
    catch(FileNotFoundException e){
    e.printStackTrace();
    log("数据库属性配置文件无法找到!");
    }
    catch(IOException e){
    e.printStackTrace();
    log("读取数据库属性配置失败!");
    }
    }
    }
      

  8.   

    datebase.properties中存放的是数据库连接属性,文件内容如下driver=sun.jdbc.odbc.JdbcOdbcDriver
    url=jdbc:odbc:hotel
    user=sa
    password=123456
      

  9.   

    注意datebase.properties要放在工程根目录下。