连接池。每次进行操作时调用一个过程

时间:2014-08-22 07:49:17

标签: connection-pooling mybatis

Hei那里,我正在研究Primefaces 5 / JSF 2 / Mybatis webapp。我的问题是。要知道每次做什么(在应用程序上)我们必须执行方法setUser(...)。我现在正在工作的公司有一个我们正在构建的应用程序的C#版本但是没有连接池,所以他们只需要在用户登录时执行该过程。

(现在我们只是在getSQLFactory方法中调用该方法,我知道这不是最佳实践......但这似乎是唯一可行的解​​决方案,不能在所有200多个Mappers中手动添加它)

public static SqlSessionFactory getSqlSessionFactory() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
ManagedNavUtils navyUtils = (ManagedNavUtils) session.getAttribute("navy");
if (navyUtils != null && navyUtils.getLoggedInUser() != null)
  setLoggedInUser(navyUtils.getLoggedInUser());
return factory;

}

每次在DB上执行某些操作时,有没有办法调用该过程?

我的mybatis-config.xml文件及相关配置:

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC" />
        <dataSource type="POOLED">
            <property name="driver" value="${database.driver}" />
            <property name="url" value="${database.url}" />
            <property name="username" value="${database.username}" />
            <property name="password" value="${database.password}" />

            <!-- CONNECTION POOLING PROPERTIES -->
            <property name="poolMaximumActiveConnections" value="20" />
            <property name="poolMaximumIdleConnections" value="5" />
            <property name="poolPingEnabled" value="false" />
        </dataSource>
    </environment>
</environments>

1 个答案:

答案 0 :(得分:1)

您可以创建mybatis plugin来拦截所有查询。

但是对于您的情况,更好的选择是在连接检索期间仅设置一次用户。某些连接池允许在从池中借用连接时进行自定义初始化。另一种可能的选择是包装mybatis使用的DataSource

对于使用mybatis附带的数据源的情况,最简单的方法是使用自定义DataSource打包DataSourceFactory

首先像这样延伸PooledDataSource

class MyPooledDataSource extends PooledDataSource {

   // all constructors should be defined but omitted for brevity

    public Connection getConnection() throws SQLException {
        Connection connection = super.getConnection();
        setLoggedInUser(connection);
        return connection;
    }

    public Connection getConnection(String username, String password) throws SQLException {
        Connection connection = super.getConnection(username, password);
        setLoggedInUser(connection);
        return connection;
    }

    private void setLoggedInUser(Connection connection) {
        // actual setting of logged in user
    }
}

然后你需要定义工厂:

public class MyDataSourceFactory extends PooledDataSourceFactory {

    public MyDataSourceFactory() {
        this.dataSource = new MyPooledDataSource();
    }
}

修改mybatis-config.xml以使mybatis使用您的数据源工厂:

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC" />
    <dataSource type="org.myproject.MyDataSourceFactory">
        <property name="driver" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />

        <!-- CONNECTION POOLING PROPERTIES -->
        <property name="poolMaximumActiveConnections" value="20" />
        <property name="poolMaximumIdleConnections" value="5" />
        <property name="poolPingEnabled" value="false" />
    </dataSource>
  </environment>
</environments>