您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“MySQL池化自定義實(shí)例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MySQL池化自定義實(shí)例分析”吧!
首先,我們需要一個(gè)可池化對(duì)象,這里我選用了com.funtester.db.mysql.FunMySql
,這是一個(gè)我自己寫的單鏈接的MySQL對(duì)象。我計(jì)劃用這個(gè)作為基礎(chǔ)可池化對(duì)象。
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操作的基礎(chǔ)類 * <p>用于存儲(chǔ)數(shù)據(jù),多用于爬蟲</p> */ public class FunMySql extends SqlBase implements IMySqlBasic { /** * {@link SqlConstant#FUN_SQL_URL}會(huì)替換IP到URL */ String url; /** * 庫 */ String database; /** * 用戶 */ String user; /** * 密碼 */ String password; Connection connection; Statement statement; /** * 私有構(gòu)造方法 * * @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); } /** * 執(zhí)行sql語句,非query語句,并不關(guān)閉連接 * * @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); } /** * 關(guān)閉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); } }
相對(duì)連接,創(chuàng)建com.funtester.db.mysql.FunMySql
的時(shí)候,順便一起初始化MySQL連接。然后再com.funtester.db.mysql.MysqlPool.FunTester#destroyObject
的時(shí)候進(jìn)行連接的回收。
/** * 池化工廠類 */ 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) } }
這里顯得有些冗余,后面再使用過程中,我會(huì)繼續(xù)優(yōu)化。通過創(chuàng)建一個(gè)com.funtester.db.mysql.MysqlPool
對(duì)象,獲取一個(gè)com.funtester.db.mysql.FunMySql
對(duì)象池。
/** * 自定義MySQL連接池對(duì)象 */ class MysqlPool extends PoolConstant { private static final Logger logger = LogManager.getLogger(MysqlPool.class); /** * {@link com.funtester.config.SqlConstant#FUN_SQL_URL}會(huì)替換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); } }
自從學(xué)習(xí)了Go語言的gorm框架和Redis框架,我發(fā)現(xiàn)其實(shí)不用把池化相關(guān)信息不用暴露出來,直接封裝原始的API,暴露給用戶使用,這樣用戶就不用關(guān)心連接的回收問題了。
/** * 借出對(duì)象 * @return */ def borrow() { try { return pool.borrowObject() } catch (e) { logger.warn("獲取${JSONObject.class} 失敗", e) } finally { new JSONObject() } } /** * 歸還對(duì)象 * @param funMySql * @return */ def back(FunMySql funMySql) { pool.returnObject(funMySql) } /** * 執(zhí)行update SQL * @param sql * @return */ def execute(def sql) { def driver = borrow() try { driver.executeUpdateSql(sql) } catch (e) { logger.warn("執(zhí)行:{}失敗", sql) } finally { back(driver) } } /** * 執(zhí)行查詢SQL * @param sql * @return */ def query(def sql) { def driver = borrow() try { return driver.executeQuerySql(sql) } catch (e) { logger.warn("執(zhí)行:{}失敗", sql) } finally { back(driver) } }
到此,相信大家對(duì)“MySQL池化自定義實(shí)例分析”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。