步骤: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放到了一边,自己开始思考怎样去做小项目练手,光学理论也不行,只有在实战中才能更好地理解它们
工作室系统开发流程
- 首页开发
2.登录可以进入自己的相关页面,自己有相册,日志的管理,如果是管理员则可以对系统进行管理,分别是管理员界面,与用户界面
管理员界面
用户界面
如果非内部成员点击没有的菜单,则没有相应的功能
接下来是数据库的设计
创建用户表,博客(日志)表,菜单表,项目表,考勤记录表,系统通知表, 菜单用户关联表
ps: 由于下午上选修课,再加上 班上的事情,数据库建表,表字段,表关系的设计,等事情只能明天继续.感觉一天好忙哦~~~~