Mybatis的PooledDataSource配置细节有哪些?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1035个文字,预计阅读时间需要5分钟。
关于Mybatis的`PooledDataSource`及其方法`pushConnection`和`popConnection`的讨论:
`PooledDataSource`是Mybatis中用于管理数据库连接的类。它通过连接池的方式管理连接,以提高数据库操作的性能。
查看`PooledDataSource`的`pushConnection`方法:
该方法用于将连接返回到连接池中。以下是该方法的基本操作:
- 将连接的空闲时间重置。- 检查连接是否需要关闭(如超过最大空闲时间)。- 如果需要,将连接关闭。- 将连接添加到连接池中。
再看`PooledDataSource`的`popConnection`方法:
该方法用于从连接池中获取连接。以下是该方法的基本操作:
- 检查连接池中是否有可用连接。- 如果有,返回一个连接。- 如果没有,创建一个新的连接并返回。
获取数据库连接:
要获取数据库连接,可以使用`getConnection`方法:
javaConnection connection=dataSource.getConnection();
@Override注解:
在实现数据库连接池相关的方法时,可以使用`@Override`注解来表明这些方法是对`PooledDataSource`类中相应方法的覆盖。
@[TOC]
聊聊Mybatis的数据源之PooledDataSource(二)
看完PooledDataSource的pushConnection()方法,再看一下它的popConnection()方法:
获取数据库连接
获取数据库的连接调用getConnection()方法:
@Override public Connection getConnection(String username, String password) throws SQLException { return popConnection(username, password).getProxyConnection(); }popConnection()方法
然后分析一下popConnection()方法:
代码虽然比较长,占篇幅,我在这里就不贴代码了,但是方法的逻辑还是比较理解的:
先从空闲连接集合中获取连接信息,如果空闲集合中没有并活跃的连接数没有达到上限的时候就可以创建新的数据库连接,如果达到上限了就判断是否有超时的连接,如果有的话就利用这个超时连接创建新的连接并把超级连接设置为无效,如果超时连接也没有,这时候就调用wait方法进行阻塞
检测连接是否可用
PooledConnection的isValid()方法用来检测数据库连接是否可用
public boolean isValid() { return valid && realConnection != null && dataSource.pingConnection(this); }看这个方法的实现代码,最终还是调用PooledDataSource的pingConnection()方法
protected boolean pingConnection(PooledConnection conn) { boolean result = true; try { result = !conn.getRealConnection().isClosed(); } catch (SQLException e) { if (log.isDebugEnabled()) { log.debug("Connection " + conn.getRealHashCode() + " is BAD: " + e.getMessage()); } result = false; } if (result && poolPingEnabled && poolPingConnectionsNotUsedFor >= 0 && conn.getTimeElapsedSinceLastUse() > poolPingConnectionsNotUsedFor) { try { if (log.isDebugEnabled()) { log.debug("Testing connection " + conn.getRealHashCode() + " ..."); } Connection realConn = conn.getRealConnection(); try (Statement statement = realConn.createStatement()) { statement.executeQuery(poolPingQuery).close(); } if (!realConn.getAutoCommit()) { realConn.rollback(); } result = true; if (log.isDebugEnabled()) { log.debug("Connection " + conn.getRealHashCode() + " is GOOD!"); } } catch (Exception e) { log.warn("Execution of ping query '" + poolPingQuery + "' failed: " + e.getMessage()); try { conn.getRealConnection().close(); } catch (Exception e2) { // ignore } result = false; if (log.isDebugEnabled()) { log.debug("Connection " + conn.getRealHashCode() + " is BAD: " + e.getMessage()); } } } return result; }总结
这篇文章主要介绍了聊聊Mybatis的数据源PooledDataSource类一些方法,包括获取数据库连接的方法getConnection(),方法中调用了popConnection(),逻辑是先从空闲连接集合中获取连接信息,如果空闲集合中没有并活跃的连接数没有达到上限的时候就可以创建新的数据库连接,如果达到上限了就判断是否有超时的连接,如果有的话就利用这个超时连接创建新的连接并把超级连接设置为无效,如果超时连接也没有,这时候就调用wait方法进行阻塞,然后分析了一下isValid()方法,这个方法是检测数据库连接是否可用,逻辑是通过执行sql语句来判断的。
本文共计1035个文字,预计阅读时间需要5分钟。
关于Mybatis的`PooledDataSource`及其方法`pushConnection`和`popConnection`的讨论:
`PooledDataSource`是Mybatis中用于管理数据库连接的类。它通过连接池的方式管理连接,以提高数据库操作的性能。
查看`PooledDataSource`的`pushConnection`方法:
该方法用于将连接返回到连接池中。以下是该方法的基本操作:
- 将连接的空闲时间重置。- 检查连接是否需要关闭(如超过最大空闲时间)。- 如果需要,将连接关闭。- 将连接添加到连接池中。
再看`PooledDataSource`的`popConnection`方法:
该方法用于从连接池中获取连接。以下是该方法的基本操作:
- 检查连接池中是否有可用连接。- 如果有,返回一个连接。- 如果没有,创建一个新的连接并返回。
获取数据库连接:
要获取数据库连接,可以使用`getConnection`方法:
javaConnection connection=dataSource.getConnection();
@Override注解:
在实现数据库连接池相关的方法时,可以使用`@Override`注解来表明这些方法是对`PooledDataSource`类中相应方法的覆盖。
@[TOC]
聊聊Mybatis的数据源之PooledDataSource(二)
看完PooledDataSource的pushConnection()方法,再看一下它的popConnection()方法:
获取数据库连接
获取数据库的连接调用getConnection()方法:
@Override public Connection getConnection(String username, String password) throws SQLException { return popConnection(username, password).getProxyConnection(); }popConnection()方法
然后分析一下popConnection()方法:
代码虽然比较长,占篇幅,我在这里就不贴代码了,但是方法的逻辑还是比较理解的:
先从空闲连接集合中获取连接信息,如果空闲集合中没有并活跃的连接数没有达到上限的时候就可以创建新的数据库连接,如果达到上限了就判断是否有超时的连接,如果有的话就利用这个超时连接创建新的连接并把超级连接设置为无效,如果超时连接也没有,这时候就调用wait方法进行阻塞
检测连接是否可用
PooledConnection的isValid()方法用来检测数据库连接是否可用
public boolean isValid() { return valid && realConnection != null && dataSource.pingConnection(this); }看这个方法的实现代码,最终还是调用PooledDataSource的pingConnection()方法
protected boolean pingConnection(PooledConnection conn) { boolean result = true; try { result = !conn.getRealConnection().isClosed(); } catch (SQLException e) { if (log.isDebugEnabled()) { log.debug("Connection " + conn.getRealHashCode() + " is BAD: " + e.getMessage()); } result = false; } if (result && poolPingEnabled && poolPingConnectionsNotUsedFor >= 0 && conn.getTimeElapsedSinceLastUse() > poolPingConnectionsNotUsedFor) { try { if (log.isDebugEnabled()) { log.debug("Testing connection " + conn.getRealHashCode() + " ..."); } Connection realConn = conn.getRealConnection(); try (Statement statement = realConn.createStatement()) { statement.executeQuery(poolPingQuery).close(); } if (!realConn.getAutoCommit()) { realConn.rollback(); } result = true; if (log.isDebugEnabled()) { log.debug("Connection " + conn.getRealHashCode() + " is GOOD!"); } } catch (Exception e) { log.warn("Execution of ping query '" + poolPingQuery + "' failed: " + e.getMessage()); try { conn.getRealConnection().close(); } catch (Exception e2) { // ignore } result = false; if (log.isDebugEnabled()) { log.debug("Connection " + conn.getRealHashCode() + " is BAD: " + e.getMessage()); } } } return result; }总结
这篇文章主要介绍了聊聊Mybatis的数据源PooledDataSource类一些方法,包括获取数据库连接的方法getConnection(),方法中调用了popConnection(),逻辑是先从空闲连接集合中获取连接信息,如果空闲集合中没有并活跃的连接数没有达到上限的时候就可以创建新的数据库连接,如果达到上限了就判断是否有超时的连接,如果有的话就利用这个超时连接创建新的连接并把超级连接设置为无效,如果超时连接也没有,这时候就调用wait方法进行阻塞,然后分析了一下isValid()方法,这个方法是检测数据库连接是否可用,逻辑是通过执行sql语句来判断的。

