享元模式--自定义数据库连接池 布满荆棘的人生 2022-12-08 12:58 183阅读 0赞 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。 在`String类`和`包装类`大量使用了**享元模式**。 ### 自定义数据库连接池 ### package 享元模式; import lombok.extern.slf4j.Slf4j; import java.sql.*; import java.util.Map; import java.util.Properties; import java.util.Random; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicIntegerArray; public class 自定义数据库连接池 { public static void main(String[] args) { Pool pool = new Pool(2); for (int i = 0; i < 5; i++) { new Thread(() -> { Connection conn = pool.borrow(); try { Thread.sleep(new Random().nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } pool.free(conn); }).start(); } } } @Slf4j class Pool{ // 1. 连接池大小 private final int poolSize; // 2. 连接池数组 private Connection[] connections; // 3. 连接状态数组 private AtomicIntegerArray states; // 4. 构造方法初始化 public Pool(int poolSize) { this.poolSize = poolSize; this.connections = new Connection[poolSize]; this.states = new AtomicIntegerArray(new int[poolSize]); for (int i = 0; i < poolSize; i++) { connections[i] = new MockConnection("连接" + i); } } // 5. 借连接 public Connection borrow(){ while(true){ for (int i = 0; i < poolSize; i++) { //获取空连接 if(states.get(i) == 0){ if(states.compareAndSet(i,0,1)){ log.debug("borrow {}",connections[i]); return connections[i]; } } } //如果没有空闲连接,当前线程进入等待 synchronized (this){ try { log.debug("wait ..."); this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } // 6. 归还连接 public void free(Connection conn){ for (int i = 0; i < poolSize; i++) { if(connections[i] == conn){ states.set(i,0); log.debug("free {}",connections[i]); synchronized (this){ this.notifyAll(); } break; } } } } class MockConnection implements Connection{ private String name; public MockConnection(String name) { this.name = name; } @Override public String toString() { return "MockConnection{" + "name='" + name + '\'' + '}'; } @Override public Statement createStatement() throws SQLException { return null; } @Override public PreparedStatement prepareStatement(String sql) throws SQLException { return null; } @Override public CallableStatement prepareCall(String sql) throws SQLException { return null; } @Override public String nativeSQL(String sql) throws SQLException { return null; } @Override public void setAutoCommit(boolean autoCommit) throws SQLException { } @Override public boolean getAutoCommit() throws SQLException { return false; } @Override public void commit() throws SQLException { } @Override public void rollback() throws SQLException { } @Override public void close() throws SQLException { } @Override public boolean isClosed() throws SQLException { return false; } @Override public DatabaseMetaData getMetaData() throws SQLException { return null; } @Override public void setReadOnly(boolean readOnly) throws SQLException { } @Override public boolean isReadOnly() throws SQLException { return false; } @Override public void setCatalog(String catalog) throws SQLException { } @Override public String getCatalog() throws SQLException { return null; } @Override public void setTransactionIsolation(int level) throws SQLException { } @Override public int getTransactionIsolation() throws SQLException { return 0; } @Override public SQLWarning getWarnings() throws SQLException { return null; } @Override public void clearWarnings() throws SQLException { } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { return null; } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return null; } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return null; } @Override public Map<String, Class<?>> getTypeMap() throws SQLException { return null; } @Override public void setTypeMap(Map<String, Class<?>> map) throws SQLException { } @Override public void setHoldability(int holdability) throws SQLException { } @Override public int getHoldability() throws SQLException { return 0; } @Override public Savepoint setSavepoint() throws SQLException { return null; } @Override public Savepoint setSavepoint(String name) throws SQLException { return null; } @Override public void rollback(Savepoint savepoint) throws SQLException { } @Override public void releaseSavepoint(Savepoint savepoint) throws SQLException { } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return null; } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return null; } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return null; } @Override public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { return null; } @Override public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { return null; } @Override public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { return null; } @Override public Clob createClob() throws SQLException { return null; } @Override public Blob createBlob() throws SQLException { return null; } @Override public NClob createNClob() throws SQLException { return null; } @Override public SQLXML createSQLXML() throws SQLException { return null; } @Override public boolean isValid(int timeout) throws SQLException { return false; } @Override public void setClientInfo(String name, String value) throws SQLClientInfoException { } @Override public void setClientInfo(Properties properties) throws SQLClientInfoException { } @Override public String getClientInfo(String name) throws SQLException { return null; } @Override public Properties getClientInfo() throws SQLException { return null; } @Override public Array createArrayOf(String typeName, Object[] elements) throws SQLException { return null; } @Override public Struct createStruct(String typeName, Object[] attributes) throws SQLException { return null; } @Override public void setSchema(String schema) throws SQLException { } @Override public String getSchema() throws SQLException { return null; } @Override public void abort(Executor executor) throws SQLException { } @Override public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { } @Override public int getNetworkTimeout() throws SQLException { return 0; } @Override public <T> T unwrap(Class<T> iface) throws SQLException { return null; } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { return false; } } 输出: 13:29:04.601 [Thread-2] DEBUG 享元模式.Pool - wait ... 13:29:04.601 [Thread-1] DEBUG 享元模式.Pool - borrow MockConnection{ name='连接1'} 13:29:04.601 [Thread-0] DEBUG 享元模式.Pool - borrow MockConnection{ name='连接0'} 13:29:04.611 [Thread-4] DEBUG 享元模式.Pool - wait ... 13:29:04.611 [Thread-3] DEBUG 享元模式.Pool - wait ... 13:29:04.718 [Thread-0] DEBUG 享元模式.Pool - free MockConnection{ name='连接0'} 13:29:04.718 [Thread-4] DEBUG 享元模式.Pool - wait ... 13:29:04.718 [Thread-3] DEBUG 享元模式.Pool - borrow MockConnection{ name='连接0'} 13:29:04.718 [Thread-2] DEBUG 享元模式.Pool - wait ... 13:29:04.727 [Thread-3] DEBUG 享元模式.Pool - free MockConnection{ name='连接0'} 13:29:04.727 [Thread-4] DEBUG 享元模式.Pool - wait ... 13:29:04.727 [Thread-2] DEBUG 享元模式.Pool - borrow MockConnection{ name='连接0'} 13:29:05.446 [Thread-2] DEBUG 享元模式.Pool - free MockConnection{ name='连接0'} 13:29:05.446 [Thread-4] DEBUG 享元模式.Pool - borrow MockConnection{ name='连接0'} 13:29:05.559 [Thread-1] DEBUG 享元模式.Pool - free MockConnection{ name='连接1'} 13:29:05.970 [Thread-4] DEBUG 享元模式.Pool - free MockConnection{ name='连接0'}
相关 享元模式--自定义数据库连接池 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象 布满荆棘的人生/ 2022年12月08日 12:58/ 0 赞/ 184 阅读
相关 享元模式 享元模式(Flyweight),就是运用共享技术有效地支持大量细粒度的对象。 享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(Externa 冷不防/ 2022年06月16日 23:20/ 0 赞/ 201 阅读
相关 享元模式 1.使用场景: 内存资源比较稀缺,不要随便浪费,如果有很多相同或者类似的对象,通过使用享元模式的方法,节省内存,例如线程池以及String类等。 2.UML表示 悠悠/ 2022年05月31日 09:49/ 0 赞/ 191 阅读
相关 享元模式 定义 享元模式:运用共享技术有效的支持大量细粒度的对象。 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太 向右看齐/ 2022年05月14日 12:15/ 0 赞/ 41 阅读
相关 享元模式 享元模式 一、概述 1. 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的 对象,我们可以通过享元模式,节省内存。 2. 享元模式以共享的方式高效地 忘是亡心i/ 2022年04月18日 04:55/ 0 赞/ 202 阅读
相关 享元模式 [享元模式][Link 1] 模式说明 所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现 ゝ一世哀愁。/ 2021年11月23日 06:46/ 0 赞/ 251 阅读
相关 享元模式 当系统中出现大量相同、相似的对象时,会导致系统性能下降。享元模式通过共享技术对相同或相似对象进行重用,从而解决这一问题。在享元模式中,存储共享实例对象的地方称为享元池 (Fly 怼烎@/ 2021年11月11日 10:50/ 0 赞/ 303 阅读
相关 享元模式 12.享元模式 我们可以共用一个 Hello world 对象,其中字符串 “Hello world” 为内部状态,可共享;字体颜色为外部状态,不可共享,由 逃离我推掉我的手/ 2021年09月17日 00:00/ 0 赞/ 298 阅读
相关 自定义数据库连接池 因为最近在研究并发技术,本想使用c3p0的,结果出了很多问题,后来想想人家的东西不一定适合我的项目需求,于是转而自己动手造轮子了。 这里技术核心在于BlockingQueu 迈不过友情╰/ 2021年06月11日 15:10/ 0 赞/ 490 阅读
相关 享元模式 元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的... 小灰灰/ 2020年06月13日 05:55/ 0 赞/ 464 阅读
还没有评论,来说两句吧...