Spring JDBC 自定定义多数据源 原理分析

1 普通数据库连接如何管理的(事务)

 

普通Spring JDBC 数据库连接

bean.xml配置


PROPERTIES.load(ClassLoaderUtil.getResourceAsStream(
        "db.properties", MultiDataSource.class));
url = PROPERTIES.getProperty("jdbc.url");
user = PROPERTIES.getProperty("jdbc.user");
password = PROPERTIES.getProperty("jdbc.password");
driver = PROPERTIES.getProperty("jdbc.driver");

    ResultSet rs = null;
    Statement stmt = null;
    Connection con = null;
    try {
        Class.forName(driver);
        con = DriverManager.getConnection(url, user, password);  
        stmt = con.createStatement();
        rs = stmt.executeQuery("SELECT CACHE_VERSION FROM audi_cache WHERE ROWNUM=1");
        String datetime = null;
        while (rs.next()) {
            datetime = rs.getString("CACHE_VERSION");
        }
        
           } catch (Exception e) {
        e.printStackTrace();
    } finally {
       if (rs != null) { // 关闭记录集
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) { // 关闭声明
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) { // 关闭连接对象
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

 

 

2 JDBCTemplate实现分析 ,

每次读取一次 都要进行 (要进行红色部分的开关)      JDBCTemplate每次读取 相当于将上述 红色字体部分 重新 写一次,封装起来

2.1 JDBCTemplate的读

public Object query(final String sql, final ResultSetExtractor rse)
    throws DataAccessException
{
    class _cls1QueryStatementCallback
        implements StatementCallback, SqlProvider
    {

        public Object doInStatement(Statement stmt)
            throws SQLException
        {
            ResultSet rs = null;
            Object obj;
            try
            {
                rs = stmt.executeQuery(sql);
                ResultSet rsToUse = rs;
                if(nativeJdbcExtractor != null)
                    rsToUse = nativeJdbcExtractor.getNativeResultSet(rs);
                obj = rse.extractData(rsToUse);
            }
            finally
            {
                JdbcUtils.closeResultSet(rs);
            }
            return obj;
        }

        public String getSql()
        {
            return sql;
        }

        _cls1QueryStatementCallback()
        {
            super();
        }
    }

    return execute(new _cls1QueryStatementCallback());
}

 

 

 

3   Spring JDBC动态多数据源进行切换  原理分析

思路:  就是改变 URL,用户名 ,和密码, 核心  将蓝色部分的代码  进行 切换, 

 

bean.xml 中加入 自定义的数据源

<!-- 定义数据源队列 –>

<bean id="crmDataSource" class="com.asiainfo.common.MultiDataSource">

<!--默认数据源(必须)—>

<property ref="coop-dataSource" name="dataSource"></property></bean>

<!-- 事务管理 –>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property ref="crmDataSource" name="dataSource"></property></bean>

  • <!--事务模板 的作用??? 如何动态切换数据库-->

    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">

    <property name="transactionManager">

    <ref bean="transactionManager" />

    </property><property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>

    </bean>

     

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

    <property name="dataSource"><ref bean="crmDataSource" />

    </property>

    </bean>

     

    Spring JDBC 自定定义多数据源 原理分析_第1张图片

  •  

    本质是重写  datasource 的getconnection方法,去根据线程变量重新获取  响应的数据库url  用户名密码 然后通过jdbctemplate 去执行相应的操作

    你可能感兴趣的:(Spring JDBC 自定定义多数据源 原理分析)