springMvc项目如何配置动态数据源

目录

  • 1.在类文件下创建jdbc.properties测试连接
  • 2.创建配置bean文件spring-dao.xml
    • 2.1 常用数据源配置
  • 3.创建类 DynamicDataSource
  • 4.创建web文件将spring-dao.xml文件引入

1.在类文件下创建jdbc.properties测试连接

#
jdbc.driverClass1=com.mysql.cj.jdbc.Driver
jdbc.url1=jdbc\:mysql\://192.168.1.1\:3306/database1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.userName1=root
jdbc.password1=123456
jdbc.initialSize1e1=50
jdbc.maxIdle1=2000
jdbc.minIdle1=50
jdbc.maxActive1=2000

#
jdbc.driverClass2=com.mysql.cj.jdbc.Driver
jdbc.url2=jdbc\:mysql\://192.168.1.2\:3306/database2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.userName2=root
jdbc.password2=123456
jdbc.initialSize1e2=50
jdbc.maxIdle2=2000
jdbc.minIdle2=50
jdbc.maxActive2=2000

2.创建配置bean文件spring-dao.xml

<context:property-placeholder location="classpath:jdbc/jdbc.properties" />
	<!--=======数据源1===========================-->
	<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClass1}" />
		<property name="url" value="${jdbc.url1}" />
		<property name="username" value="${jdbc.userName1}" />
		<property name="password" value="${jdbc.password1}" />
		<property name="initialSize" value="${jdbc.initialSize1e1}"/>
		<property name="maxActive" value="${jdbc.maxIdle1}" />
		<property name="maxIdle" value="${jdbc.minIdle1}" />
		<property name="minIdle" value="${jdbc.maxActive1}"/>
	</bean>
	<!--=======数据源2===========================-->
	<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClass2}" />
		<property name="url" value="${jdbc.url2}" />
		<property name="username" value="${jdbc.userName2}" />
		<property name="password" value="${jdbc.password2}" />
		<property name="initialSize" value="${jdbc.initialSize1e2}"/>
		<property name="maxActive" value="${jdbc.maxIdle2}" />
		<property name="maxIdle" value="${jdbc.minIdle2}" />
		<property name="minIdle" value="${jdbc.maxActive2}"/>
	</bean>

<!--=======配置数据源动态切换===========================-->
	<!-- 配置动态数据源 --> 
	<!-- 别忘记创建类 DynamicDataSource --> 
	<bean id="dynamicDataSource" class="cn.metter.produce.testproduct.model.DynamicDataSource">
		<property name="defaultTargetDataSource" ref="dataSource1" />
		<property name="targetDataSources">
			<map>
				<entry key="dataSource1" value-ref="dataSource1" />
				<!--切换-->
				<entry key="dataSource2" value-ref="dataSource2" />
			</map>
		</property>
	</bean>

	<!--  sqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 数据库连接池 -->
		<property name="dataSource" ref="dynamicDataSource" />
		<!-- 加载mybatis的全局配置文件 -->
		<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
	</bean>

	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
		<property name="basePackage" value="cn.test.testMapper"></property>
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
	</bean>

2.1 常用数据源配置

		<property name="maxWait" value="5000" />

		<property name="logAbandoned" value="true" />
		<property name="removeAbandoned" value="true" />
		<property name="removeAbandonedTimeout" value="90" />
	    <property name="maxWait" value="3000" />
		<property name="validationQuery">
			<value>SELECT 1</value>
		</property>
		<property name="testOnBorrow">
			<value>true</value>
		</property>
		
以下是一些常见的配置选项:

1. **maxTotal / maxActive**: 数据源允许的最大活动连接数。
2. **maxIdle**: 数据源允许的最大空闲连接数。
3. **minIdle**: 数据源允许的最小空闲连接数。
4. **initialSize**: 数据源在启动时创建的初始连接数。
5. **maxWaitMillis**: 在连接池耗尽并且达到`maxTotal`时,应用程序等待可用连接的最大时间(以毫秒为单位)。
6. **timeBetweenEvictionRunsMillis**: 连接池进行空闲连接回收的时间间隔(以毫秒为单位)。
7. **minEvictableIdleTimeMillis**: 连接池中的连接在被认定为空闲连接并且被移除之前,需要保持空闲的最小时间(以毫秒为单位)。
8. **testWhileIdle**: 是否在连接池空闲连接回收线程运行时,对连接进行测试。
9. **testOnReturn**: 是否在连接返回连接池时对连接进行测试。
10. **timeBetweenEvictionRunsMillis**: 空闲连接回收线程运行的时间间隔(以毫秒为单位)。
11. **removeAbandoned**: 是否移除超过指定时间未使用且被认定为废弃的连接。
12. **removeAbandonedTimeout**: 超过指定时间未使用且被认定为废弃的连接将被移除的超时时间(以秒为单位)。
13. **logAbandoned**: 是否记录被移除的废弃连接日志。
14. **defaultAutoCommit**: 连接的默认自动提交行为。
15. **defaultTransactionIsolation**: 连接的默认事务隔离级别。

3.创建类 DynamicDataSource

package cn.test.testmodel;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import javax.servlet.http.HttpServletRequest;

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Autowired
    private HttpServletRequest request;

    @Override
    protected Object determineCurrentLookupKey() {
        String ipAddress = request.getRequestURL().toString();
        String dataSourceName = switchDataSource(ipAddress);
        return dataSourceName;
    }

    private String switchDataSource(String ipAddress) {    
    //切换逻辑
        if (ipAddress.indexOf("requestIpAddressStr") > -1) {
            return "dataSource1";
        } else {
            return "dataSource2";
        }
    }

}

4.创建web文件将spring-dao.xml文件引入

具体文件引入和结构体参考另一章连接

	<!-- 加载spring容器 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:/spring/spring-dao.xml</param-value>
	</context-param>

你可能感兴趣的:(Spring,java,spring)