建立连接池连接数据库

自行建立连接池。

关键代码:

(1)

db.properties//外部配置文件(名值对的方式)
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433
username=sa
password=123456
jdbcPoolInitSize=10//容量;PoolSize=maxSize


(2)JdbcPool.java

packageex4;
importjava.io.InputStream;
importjava.io.PrintWriter;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
importjava.lang.reflect.Proxy;
importjava.sql.*;
importjava.util.*;
importjava.util.logging.Logger;
importjavax.sql.DataSource;
publicclass JdbcPool implements DataSource{
      private staticLinkedList<Connection> listConnections=newLinkedList<Connection>();//动态改变,用LinkedList效率高;因为这个连接在这个类中只有一个实例,所以声明为类变量形式(privatestatic),在这个实例中有一个LinkedList来保存Connection对象——工具。
      static{//初始化数据库连接池
             InputStreamin=JdbcPool.class.getResourceAsStream("db.properties");
             //加载类的路径,访问的过程
             Properties prop=new Properties();//建立Properties工具类
             try{
                    prop.load(in);//加载流
                    //获取文件中所有参数的信息
                    Stringdriver=prop.getProperty("driver");
                    Stringurl=prop.getProperty("url");
                    Stringusername=prop.getProperty("username");
                    Stringpassword=prop.getProperty("password");
                    intjdbcPoolInitSize=Integer.parseInt(prop.getProperty("jdbcPoolInitSize"));
                    Class.forName(driver);
                    for(inti=0;i<jdbcPoolInitSize;i++){//声明10个connection实例,并将这10个实例添加到listConnections链表中
                           Connectionconn=DriverManager.getConnection(url, username, password);
                           System.out.println("链接的数量"+conn);
                           listConnections.add(conn);
                    }
             }catch(Exception e){
                    e.printStackTrace();
             }
      }
      @Override
      public PrintWriter getLogWriter() throwsSQLException {
             // TODO Auto-generated method stub
             return null;
      }
      @Override
      public int getLoginTimeout() throwsSQLException {
             // TODO Auto-generated method stub
             return 0;
      }
      @Override
      public Logger getParentLogger() throwsSQLFeatureNotSupportedException {
             // TODO Auto-generated method stub
             return null;
      }
      @Override
      public void setLogWriter(PrintWriter out)throws SQLException {
             // TODO Auto-generated method stub        
      }
      @Override
      public void setLoginTimeout(int arg0)throws SQLException {
             // TODO Auto-generated method stub        
      }
      @Override
      public boolean isWrapperFor(Class<?>arg0) throws SQLException {
             // TODO Auto-generated method stub
             return false;
      }
      @Override
      public <T> T unwrap(Class<T>arg0) throws SQLException {
             // TODO Auto-generated method stub
             return null;
      }
      @Override
      public Connection getConnection() throwsSQLException {
             // TODO Auto-generated method stub
             if(listConnections.size()>0){
                    final Connectionconn=listConnections.removeFirst();//取链表中第一个元素,并从链表中移除它,链表长度-1,资源分配给用户
                    System.out.println("空闲链接的数量"+listConnections.size());
                    return (Connection)Proxy.newProxyInstance(JdbcPool.class.getClassLoader(),conn.getClass().getInterfaces(),new InvocationHandler() {//动态代理的方式,代理Connection对象,调用的时候调用它;newInvocationHandler()来自反射的这个类
                           @Override
                           public Objectinvoke(Object proxy, Method method, Object[] args) throws Throwable {
                                  // TODOAuto-generated method stub
                                  if(!method.getName().equals("close")){//调用非close方法
                                         returnmethod.invoke(conn, args);
                                  }else{//调用close方法
                                         listConnections.add(conn);
                                         System.out.println(conn+"释放了链接");
                                         System.out.println("链接的数量"+listConnections.size());
                                         returnnull;
                                  }
                           }
                    } );
             }else{//连接池中无连接,抛出异常
                    throw newRuntimeException("链接已满");
             }
      }
      @Override//因为初始化提供了用户名和密码,所以没写这个函数
     public Connection getConnection(Stringusername, String password) throws SQLException {
             // TODO Auto-generated method stub
             return null;
      }
}

(3)JdbcUtil.java

packageex4;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclass JdbcUtil {//建立包装类,工具类
      private static JdbcPool pool=newJdbcPool();
      public static ConnectiongetConnection()throws SQLException{
             return pool.getConnection();
      }
      public static void release(Connectionconn,Statement st,ResultSet rs){
      //释放Connection类,及建立在其基础上的两个类
             if(rs!=null){
                    try{
                           rs.close();
                    }catch(Exception e){
                           e.printStackTrace();
                    }
                    rs=null;
             }
             if(st!=null){
                    try{
                           st.close();
                    }catch(Exception e){
                           e.printStackTrace();
                    }
                    st=null;
             }
             if(conn!=null){
                    try{
                           conn.close();
                    }catch(Exception e){
                           e.printStackTrace();
                    }
                    conn=null;
             }
      }
}

(4)Main.java

packageex4;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclass Main {
      public static void main(String[] args){
             try{
                    Connectionconn=JdbcUtil.getConnection();
//由于JdbcUtil是工具类,所以直接调用它的方法
                    Statementstmt=conn.createStatement();
                    String sql="selectsn,sex from [EDUCATION].[dbo].[Student]";
                    ResultSetrs=stmt.executeQuery(sql);
                    while(rs.next()){
                           System.out.println(rs.getString("sn")+""+rs.getString("sex"));
                    }
                    JdbcUtil.release(conn, stmt,rs);//释放,添加连接池
             }catch(SQLException e){
                    e.printStackTrace();
             }
      }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值