Maison > Article > base de données > Analyse d'instance personnalisée poolée MySQL
Tout d'abord, nous avons besoin d'un objet poolable. Ici, j'ai choisi com.funtester.db.mysql.FunMySql
, qui est un objet MySQL à lien unique écrit par moi-même. Je prévois de l'utiliser comme objet de base poolable. 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); } }Pool Chemical FactoryConnexion relative, lors de la création de
com.funtester.db.mysql.FunMySql
, la connexion MySQL est initialisée en même temps. Ensuite, la connexion est recyclée sur com.funtester.db.mysql.MysqlPool.FunTester#destroyObject
. /** * 借出对象 * @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) } }Object pool🎜🎜Cela semble un peu redondant ici, je continuerai à l'optimiser lors de son utilisation ultérieure. Obtenez un pool d'objets
com.funtester.db.mysql.FunMySql
en créant un objet com.funtester.db.mysql.MysqlPool
. 🎜rrreee🎜Encapsulation API🎜🎜Depuis que j'ai appris le framework gorm et le framework Redis du langage Go, j'ai découvert qu'il n'était pas nécessaire d'exposer les informations liées au pooling. L'API d'origine est directement encapsulée et exposée aux utilisateurs, de sorte que les utilisateurs n'en ont pas besoin. se soucier de la connexion. Le recyclage est un problème. 🎜rrreeeCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!