• 标准连接池实现


    步骤:1.实现dataSource接口

    2.声明一个集合类用于管理多个连接

    3.必须要拥有一种能能力,回收连接

    /**
     * 标准的连接
     */
    public class DBPool implements DataSource {
    	//声明一个池管理对象
    	private LinkedList<Connection> pool = new LinkedList<Connection>();
    	//在初始化这个DataSourc的子类时在构造方法设置多个连接
    	public DBPool(){
    		try{
    			Class.forName("com.mysql.jdbc.Driver");
    			String url = "jdbc:mysql:///db?characterEncoding=UTf8";
    			for(int i=0;i<3;i++){
    				final Connection con = DriverManager.getConnection(url,"root","123");
    				Object proxyedConn =
    						Proxy.newProxyInstance(DBPool.class.getClassLoader(),
    								new Class[]{Connection.class},
    								new InvocationHandler() {
    									public Object invoke(Object proxyedConnection, Method method, Object[] args)
    											throws Throwable {
    										if(method.getName().equals("close")){
    											synchronized (pool) {
    												pool.addLast((Connection) proxyedConnection);
    												pool.notify();
    											}
    											return  null;
    										}
    										//目标方法的返回值
    										Object returnValue=method.invoke(con, args);
    										return returnValue;
    									}
    								});
    				pool.add((Connection) proxyedConn);
    			}
    		}catch(Exception e){
    			throw new RuntimeException(e.getMessage(),e);
    		}
    	}
    	public Connection getConnection() throws SQLException {
    		synchronized (pool) {
    			if(pool.size()==0){
    				try {
    					pool.wait();
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				return getConnection();
    			}
    			Connection con = pool.removeFirst();
    			System.err.println("siize:"+pool.size());
    			return con;
    		}
    	}
    	
    
    	
    	
    	
    	
    	
    	public PrintWriter getLogWriter() throws SQLException {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	public void setLogWriter(PrintWriter out) throws SQLException {
    		// TODO Auto-generated method stub
    		
    	}
    
    	public void setLoginTimeout(int seconds) throws SQLException {
    		// TODO Auto-generated method stub
    		
    	}
    
    	public int getLoginTimeout() throws SQLException {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    
    	public <T> T unwrap(Class<T> iface) throws SQLException {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	public boolean isWrapperFor(Class<?> iface) throws SQLException {
    		// TODO Auto-generated method stub
    		return false;
    	}
    	public Connection getConnection(String username, String password)
    			throws SQLException {
    		// TODO Auto-generated method stub
    		return null;
    	}
    	
    }
    

    用包装模式实现数据库连接池

    我这里只写部分代码,对close()方法增强

    public class MyDataSource implements DataSource {
    	private LinkedList<Connection> pool = new LinkedList<Connection>();
    	public MyDataSource() {
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    			String url = "jdbc:mysql:///db?characterEncoding=UTf8";
    			for (int i = 0; i < 3; i++) {
    				//创建原生的连接,// com.mysql.jdbc.JDBC4Connection@8888
    				Connection con = DriverManager.getConnection(url, "root",
    						"123");
    				//声明包装类
    				MyConn conn = new MyConn(con);
    				pool.add(conn);//将包装类添加到池中去
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	//此方法来自于datasource,用于返回一个连接
    	public Connection getConnection() throws SQLException {
    		synchronized (pool) {
    			if (pool.size() == 0) {
    				try {
    					pool.wait();
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				return getConnection();
    			}
    			Connection con = pool.removeFirst();
    			System.err.println("siize:" + pool.size());
    			return con;
    		}
    	}
    
    	// 以下包装connection
    	class MyConn implements Connection {
    		// 声明被包装类的成员
    		private Connection conn;
    
    		// 通过构造接收MySql的connection的对象JDBC4Connection@8888
    		public MyConn(Connection con) {
    			this.conn = con;
    		}
    		//关闭连接
    		public void close() throws SQLException {
    			synchronized (pool) {
    				//有人调用了关闭方法,不能关
    				System.err.println("有人还连接了。。。。"+this);
    				pool.add(this);
    				pool.notify();
    			}
    		}
    

    下午根据刀哥的指点,暂时把c3p0放到了一边,自己开始思考怎样去做小项目练手,光学理论也不行,只有在实战中才能更好地理解它们

     工作室系统开发流程

    1. 首页开发

    2.登录可以进入自己的相关页面,自己有相册,日志的管理,如果是管理员则可以对系统进行管理,分别是管理员界面,与用户界面

    管理员界面

    用户界面

    如果非内部成员点击没有的菜单,则没有相应的功能

    接下来是数据库的设计

    创建用户表,博客(日志)表,菜单表,项目表,考勤记录表,系统通知表, 菜单用户关联表

    ps: 由于下午上选修课,再加上 班上的事情,数据库建表,表字段,表关系的设计,等事情只能明天继续.感觉一天好忙哦~~~~

     

  • 相关阅读:
    oracle 添加用户
    oracle---存储结构及其之间的关系和创建数据库
    oracle---临时表空间
    对字符串进行加密解密知识
    面向对象---函数重复---原型
    Ajax
    sqlHelper+app.config
    sqlHelper ---转载
    web.config中的连接字符串 ---关于 providerName 特性---转载
    SQL中的cast()函数--转载
  • 原文地址:https://www.cnblogs.com/ylfeiu/p/3624074.html
Copyright © 2020-2023  润新知