<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近在學習了通用池化框架commons-pool2
實踐之後,再HTTP效能測試中進行了實踐,結果出乎意料,對於效能提升沒啥卵用。經過我自己的本地測試,效能也是足夠好的。
後來我仔細想了想,原來是我用錯地方了。本來想自己寫一個Redis的連線池的沒想到,jedis
的連線池本身就是commons-pool2
開發的,讓我有點意外,看來想的是一樣的。commons-pool2
用來做連線池是非常不錯的。
我仔細找了找,發現還缺一個原生的MySQL連線池,而不是springboot那樣需要啟動一個服務才行。當然應該也是有的,不過我非常想自己寫一個然後進行各類測試,所以也沒有仔細找。
首先,我們需要一個可池化物件,這裡我選用了com.funtester.db.mysql.FunMySql
,這是一個我自己寫的單連結的MySQL物件。我計劃用這個作為基礎可池化物件。
package com.funtester.db.mysql; import com.funtester.base.interfaces.IMySqlBasic; import com.funtester.config.SqlConstant; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; /** * mysql操作的基礎類 * <p>用於儲存資料,多用於爬蟲</p> */ public class FunMySql extends SqlBase implements IMySqlBasic { /** * {@link SqlConstant#FUN_SQL_URL}會替換IP到URL */ String url; /** * 庫 */ String database; /** * 使用者 */ String user; /** * 密碼 */ String password; Connection connection; Statement statement; /** * 私有構造方法 * * @param url 連線地址,包括埠 * @param database 庫 * @param user 使用者名稱 * @param password 密碼 */ public FunMySql(String url, String database, String user, String password) { this.url = url; this.database = database; this.user = user; this.password = password; getConnection(database); } /** * 初始化連線 */ @Override public void getConnection() { getConnection(EMPTY); } /** * 執行sql語句,非query語句,並不關閉連線 * * @param sql */ @Override public void executeUpdateSql(String sql) { SqlBase.executeUpdateSql(connection, statement, sql); } /** * 查詢功能 * * @param sql * @return */ @Override public ResultSet executeQuerySql(String sql) { return SqlBase.executeQuerySql(connection, statement, sql); } /** * 關閉query連線 */ @Override public void over() { SqlBase.close(connection, statement); } @Override public void getConnection(String database) { if (connection == null) connection = SqlBase.getConnection(SqlConstant.FUN_SQL_URL.replace("ip", url).replace("database", database), user, password); if (statement == null) statement = SqlBase.getStatement(connection); } }
相對連線,建立com.funtester.db.mysql.FunMySql
的時候,順便一起初始化MySQL連線。然後再com.funtester.db.mysql.MysqlPool.FunTester#destroyObject
的時候進行連線的回收。
/** * 池化工廠類 */ private class FunTester extends BasePooledObjectFactory<FunMySql> { @Override FunMySql create() throws Exception { return new FunMySql(url, database, user, password) } @Override PooledObject<FunMySql> wrap(FunMySql obj) { return new DefaultPooledObject<FunMySql>(obj) } @Override void destroyObject(PooledObject<FunMySql> p) throws Exception { p.getObject().over() super.destroyObject(p) } }
這裡顯得有些冗餘,後面再使用過程中,我會繼續優化。通過建立一個com.funtester.db.mysql.MysqlPool
物件,獲取一個com.funtester.db.mysql.FunMySql
物件池。
/** * 自定義MySQL連線池物件 */ class MysqlPool extends PoolConstant { private static final Logger logger = LogManager.getLogger(MysqlPool.class); /** * {@link com.funtester.config.SqlConstant#FUN_SQL_URL}會替換IP到URL*/ String url; /** * 庫 **/ String database; /** * 使用者 **/ String user; /** * 密碼 **/ String password; private GenericObjectPool<FunMySql> pool MysqlPool(String url, String database, String user, String password) { this.url = url this.database = database this.user = user this.password = password init() } /** * 初始化連線池 * @return */ def init() { GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); poolConfig.setMaxTotal(MAX); poolConfig.setMinIdle(MIN_IDLE); poolConfig.setMaxIdle(MAX_IDLE); poolConfig.setMaxWaitMillis(MAX_WAIT_TIME); poolConfig.setMinEvictableIdleTimeMillis(MAX_IDLE_TIME); pool = new GenericObjectPool<FunMySql>(new FunTester(), poolConfig); } }
自從學習了Go語言的gorm框架和Redis框架,我發現其實不用把池化相關資訊不用暴露出來,直接封裝原始的API,暴露給使用者使用,這樣使用者就不用關心連線的回收問題了。
/** * 借出物件 * @return */ def borrow() { try { return pool.borrowObject() } catch (e) { logger.warn("獲取${JSONObject.class} 失敗", e) } finally { new JSONObject() } } /** * 歸還物件 * @param funMySql * @return */ def back(FunMySql funMySql) { pool.returnObject(funMySql) } /** * 執行update SQL * @param sql * @return */ def execute(def sql) { def driver = borrow() try { driver.executeUpdateSql(sql) } catch (e) { logger.warn("執行:{}失敗", sql) } finally { back(driver) } } /** * 執行查詢SQL * @param sql * @return */ def query(def sql) { def driver = borrow() try { return driver.executeQuerySql(sql) } catch (e) { logger.warn("執行:{}失敗", sql) } finally { back(driver) } }
以上就是MySQL連線池自定義範例詳解的詳細內容,更多關於MySQL連線池自定義的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45