`

持久层动态创建、启动、停止和使用多个数据源的方法

阅读更多
本文介绍bbossgroups 持久层框架动态创建、启动、停止和使用多个数据源的方法,直接看代码,欢迎大家一起讨论,有疑问可相互交流。
//启动一个连接池数据源
DBUtil.startPool(dbname, dbdriver, dburl, dbuser, dbpassword,
validationQuery);
//启动一个非连接池数据源
DBUtil.startNoPool(dbname, dbdriver, dburl, dbuser, dbpassword,
validationQuery);

停止数据源:
DBUtil.stopPool(dbname);//停止指定数据源名称
DBUtil.stopPool();//停止默认数据源(poolman.xml中的排在第一个位置的数据源)



@Test
    public void stopPool()
    {
        try {
			DBUtil.stopPool(null);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    @Test
    public void startPool()
    {
        try {
        	DBUtil.getJDBCPoolMetaData(null);
			DBUtil.startPool(null);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    @Test
    public void testExternalMeta()
    {
        try {
        	DBUtil.startPool(null);
        	JDBCPoolMetaData meta = DBUtil.getJDBCPoolMetaData("mq");
        	JDBCPool pool = DBUtil.getPool("mq");
        	PoolmanStatic sss = new PoolmanStatic();
        	TransferObjectFactory.createTransferObject(meta, sss);
        	System.out.println(pool.getStartTime());
        	System.out.println(pool.getStopTime());
        	System.out.println(pool.getStatus());
        	sss.isExternal();
        	DBUtil.stopPool("bspf");
        	System.out.println(pool.getStartTime());
        	System.out.println(pool.getStopTime());
        	System.out.println(pool.getStatus());
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    @Test
    public void testMeta()
    {
        try {
        	DBUtil.startPool(null);
        	JDBCPoolMetaData meta = DBUtil.getJDBCPoolMetaData("bspf");
        	JDBCPool pool = DBUtil.getPool("bspf");
        	PoolmanStatic sss = new PoolmanStatic();
        	TransferObjectFactory.createTransferObject(meta, sss);
        	System.out.println(pool.getStartTime());
        	System.out.println(pool.getStopTime());
        	System.out.println(pool.getStatus());
        	sss.isExternal();
        	DBUtil.stopPool("bspf");
        	PreparedDBUtil db = new PreparedDBUtil();
    		db.preparedSelect("Select 1 from dual");
    		db.executePrepared();
        	System.out.println(pool.getStartTime());
        	System.out.println(pool.getStopTime());
        	System.out.println(pool.getStatus());
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
     
    
    @Test
    public void startstopExterPool()
    {
        try {
        	
//			DBUtil.stopPool("mq");
			System.out.println("DBUtil.statusCheck(\"mq\"):"+DBUtil.statusCheck("mq"));
			System.out.println("DBUtil.statusCheck(\"bspf\"):"+DBUtil.statusCheck("bspf"));
			System.out.println("DBUtil.statusCheck(\"kettle\"):"+DBUtil.statusCheck("kettle"));
			DBUtil dbutil= new DBUtil();
			try {
				
				dbutil.executeSelect("mq", "Select 1 from dual");
				System.out.println("dbutil.size():" + dbutil.size());
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			DBUtil.startPool("mq");
			dbutil = new DBUtil();
			dbutil.executeSelect("mq","Select 1 from dual");
    		System.out.println("dbutil.size():" + dbutil.size());
			System.out.println("DBUtil.statusCheck(\"mq\"):"+DBUtil.statusCheck("mq"));
			System.out.println("DBUtil.statusCheck(\"bspf\"):"+DBUtil.statusCheck("bspf"));
			System.out.println("DBUtil.statusCheck(\"kettle\"):"+DBUtil.statusCheck("kettle"));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    @Test
	public void testStartPool()
	{
    	TransactionManager tm = new TransactionManager();
    	try
    	{
    		DBUtil dbutil = new DBUtil();
    		String name = "db", driver="oracle.jdbc.driver.OracleDriver", jdbcurl="jdbc:oracle:thin:@//172.16.25.219:1521/orcl", username="baseline", password="baseline", readOnly="true", validationQuery="select 1 from dual";
    		DBUtil.startPool("db", driver, jdbcurl, username, password, readOnly, validationQuery);
    		tm.begin();
    		
    		dbutil.executeSelect("db","Select 1 from dual");
    		tm.commit();
    		System.out.println("dbutil.size():" + dbutil.size());
    		DBUtil.stopPool("db");
    		PreparedDBUtil db = new PreparedDBUtil();
    		db.preparedSelect("db","Select 1 from dual");
    		db.executePrepared();
    		
//    		dbutil.executeSelect("db","Select 1 from dual");
    		
    	}
    	catch(Exception e)
    	{
    		e.printStackTrace();
    	}
	}
    @Test
    public void testDBStatusStatic() throws SQLException
    {
    	int numactive = DBUtil.getNumActive("mysql");
    	int numIdle = DBUtil.getNumIdle("mysql");
    	DBUtil.getConection("mysql");
    	List<PoolableConnection> objects = (List<PoolableConnection>)DBUtil.getTraceObjects("mysql");
    	for(int i = 0;  objects != null && i < objects.size(); i ++)
    	{
    		PoolableConnection con = objects.get(i);
    		System.out.println(con.getAutoCommit());
    		System.out.println(con.toString());
    	}
    	System.out.println();
//    	int numactive = DBUtil.getNumActive("bspf");
    	
    }
    @Test
    public void testStartPoolFromConf()
    {
    	String configfile = "custom_poolman.xml";
    	SQLUtil.startPoolFromConf(configfile);
    	DBUtil dbutil = new DBUtil();
    	try {
			dbutil.executeSelect("bspf_custom_1","Select * from tableinfo");
			System.out.println("bspf_custom_1:"+dbutil.size());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			dbutil.executeSelect("bspf_custom","Select * from tableinfo");
			System.out.println("bspf_custom:"+dbutil.size());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    @Test
    public void startPoolFromConf()
	{
    	String configfile = "custom_poolman.xml";
    	String dbnamespace = "test";
    	SQLUtil.startPoolFromConf(configfile,dbnamespace);
    	DBUtil dbutil = new DBUtil();
    	try {
			dbutil.executeSelect("test:bspf_custom_1","Select * from tableinfo");
			System.out.println("test:bspf_custom_1:"+dbutil.size());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			dbutil.executeSelect("test:bspf_custom","Select * from tableinfo");
			System.out.println("test:bspf_custom:"+dbutil.size());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			dbutil.stopPool("test:bspf_custom_1");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			dbutil.stopPool("test:bspf_custom");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
    @Test
	public void startPoolFromConfWithAllParams()
	{
    	String configfile = "custom_poolman.xml";
    	String dbnamespace = "test";
    	String[] dbnames = new String[]{"bspf_custom_1"};
    	SQLUtil.startPoolFromConf(configfile,dbnamespace,dbnames);
    	DBUtil dbutil = new DBUtil();
    	try {
			dbutil.executeSelect("test:bspf_custom_1","Select * from tableinfo");
			System.out.println("test:bspf_custom_1:"+dbutil.size());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			dbutil.executeSelect("test:bspf_custom","Select * from tableinfo");
			System.out.println("test:bspf_custom:"+dbutil.size());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	@Test
	public void startPoolFromConfNulldbnamespace() {
		String configfile = "custom_poolman.xml";
    	String dbnamespace = null;
    	String[] dbnames = new String[]{"bspf_custom_1"};
    	SQLUtil.startPoolFromConf(configfile,dbnamespace,dbnames);
    	DBUtil dbutil = new DBUtil();
    	try {
			dbutil.executeSelect("bspf_custom_1","Select * from tableinfo");
			System.out.println("bspf_custom_1:"+dbutil.size());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			dbutil.executeSelect("bspf_custom","Select * from tableinfo");
			System.out.println("bspf_custom:"+dbutil.size());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Test
	public void testStartPoolFromTempate() throws SQLException
	{
		DBUtil.getConection();
		String poolname = "bspf-custom";
		String driver = "org.apache.derby.jdbc.EmbeddedDriver";
		String jdbcurl = "jdbc:derby:D:/workspace/bbossgroups-3.1/bboss-mvc/database/cimdb";
		String username = ""; 
		String password = "";
		String readOnly = "false";
		String txIsolationLevel = "READ_COMMITTED";
		String validationQuery = "select 1 from dual";
		String jndiName = "jdbc/derby-ds-custom";
		int initialConnections = 2;
		int minimumSize = 0;
		int maximumSize = 10;
		boolean usepool = true;
		boolean  external = true;
		String externaljndiName = "jdbc/derby-ds";        
		boolean showsql = true;		
		SQLUtil.startPool( poolname, driver, jdbcurl, username, password,
        		 readOnly,
        		 txIsolationLevel,
        		 validationQuery,
        		 jndiName,   
        		 initialConnections,
        		 minimumSize,
        		 maximumSize,
        		 usepool,
        		  external,
        		 externaljndiName        , showsql		
        		);
	}


通过以下一组接口你可以非常方便地动态创建和管理连接池,包括启动,停止,状态检测,可以根据需要调用相应的启动和创建方法,呵呵
DBUtil.stopPool   
DBUtil.startPool   
DBUtil.statusCheck   
DBUtil.startPool("db", driver, jdbcurl, username, password, readOnly, validationQuery);      
SQLUtil.startPoolFromConf(configfile);      
SQLUtil.startPoolFromConf(configfile,dbnamespace);      
SQLUtil.startPoolFromConf(configfile,dbnamespace,dbnames);     
SQLUtil.startPool( poolname, driver, jdbcurl, username, password,      
                 readOnly,      
                 txIsolationLevel,      
                 validationQuery,      
                 jndiName,         
                 initialConnections,      
                 minimumSize,      
                 maximumSize,      
                 usepool,      
                  external,      
                 externaljndiName        , showsql            
                );    


补充说明,bboss数据库类型名称和适配器映射关系:
        adapters.put("as400", DBDB2400.class);       
        adapters.put("db2app", DBDB2App.class);
        adapters.put("db2net", DBDB2Net.class);
        adapters.put("cloudscape", DBCloudscape.class);
        adapters.put("hypersonic", DBHypersonicSQL.class);
        adapters.put("interbase", DBInterbase.class);
        adapters.put("instantdb", DBInstantDB.class);
        adapters.put("mssql", DBMSSQL.class);
        adapters.put("mysql", DBMM.class);
        adapters.put("oracle", DBOracle.class);
        adapters.put("postgresql", DBPostgres.class);
        adapters.put("sapdb", DBSapDB.class);
        adapters.put("sybase", DBSybase.class);
        adapters.put("weblogic", DBWeblogic.class);
        adapters.put("axion", DBAxion.class);
        adapters.put("informix", DBInformix.class);
        adapters.put("odbc", DBOdbc.class);
        adapters.put("msaccess", DBOdbc.class);

        adapters.put("derby", DBDerby.class);

        adapters.put("", DBNone.class);
分享到:
评论
8 楼 yin_bp 2012-10-23  
在发布的版本中/bestpractices下有个persistent工程就是持久的示例工程
7 楼 yin_bp 2012-10-23  
lx13345 写道
custom_poolman.xml这个应该在哪里被加载?

在应用启动的时候就要加载起来,bboss持久层的使用文档请关注博客中的相关介绍持久层的文章:
http://yin-bp.iteye.com/category/55607
6 楼 lx13345 2012-10-23  
不用别的框架,就用bboss,该如何?给个完整的例子?
5 楼 lx13345 2012-10-23  
需要我手动编写一个类来加载,完成数据源的获取,?
4 楼 lx13345 2012-10-23  
或者说,我编写dao的时候,。。。?有些迷茫,
3 楼 lx13345 2012-10-23  
custom_poolman.xml这个应该在哪里被加载?
2 楼 yin_bp 2011-06-29  
custom_poolman.xml文件的内容:
<?xml version="1.0" encoding="gb2312"?>

<poolman>

  <management-mode>local</management-mode>

<datasource>

    <dbname>bspf_custom</dbname>
	<loadmetadata>false</loadmetadata>
    <jndiName>jdbc/mysql-ds</jndiName>
    <driver>com.mysql.jdbc.Driver</driver>

     <url>jdbc:mysql://172.16.25.139:3306/cim</url> 

    <username>root</username>
    <password>123456</password>

    <txIsolationLevel>READ_COMMITTED</txIsolationLevel>

    <nativeResults>true</nativeResults>

    <poolPreparedStatements>false</poolPreparedStatements>

    <initialConnections>2</initialConnections>
    
    <minimumSize>0</minimumSize>
    <maximumSize>10</maximumSize>
	<!--控制connection达到maximumSize是否允许再创建新的connection
		true:允许,缺省值
		false:不允许-->
    <maximumSoft>false</maximumSoft>
    
    <!-- 
    是否检测超时链接(事务超时链接)
    true-检测,如果检测到有事务超时的链接,系统将强制回收(释放)该链接
    false-不检测,默认值
     -->
    <removeAbandoned>true</removeAbandoned>
	<!--
		链接使用超时时间(事务超时时间)
		单位:秒
	-->
    <userTimeout>50</userTimeout>
    <!-- 
    	系统强制回收链接时,是否输出后台日志
    	true-输出,默认值
    	false-不输出
     -->
    <logAbandoned>true</logAbandoned>
    
    <!-- 
    	数据库会话是否是readonly,缺省为false
     -->
    <readOnly>false</readOnly>
	
	<!--
		对应属性:timeBetweenEvictionRunsMillis
		the amount of time (in milliseconds) to sleep between examining idle objects for eviction 
	-->
	<skimmerFrequency>10</skimmerFrequency>
	<!--对应于minEvictableIdleTimeMillis 属性:
	minEvictableIdleTimeMillis the minimum number of milliseconds 
	an object can sit idle in the pool before it is eligable for evcition
	单位:秒
	
	空闲链接回收时间,空闲时间超过指定的值时,将被回收
	-->
	<connectionTimeout>60</connectionTimeout>
	<!--
	numTestsPerEvictionRun 
	the number of idle objects to 
	examine per run within the idle object eviction thread (if any)
	
	每次回收的链接个数 
	-->
    <shrinkBy>5</shrinkBy>
    <!--
    /**
     * 检测空闲链接处理时,是否对空闲链接进行有效性检查控制开关
     * true-检查,都检查到有无效链接时,直接销毁无效链接
     * false-不检查,缺省值
     */
     -->
    <testWhileidle>true</testWhileidle>


    <!--
        定义数据库主键生成机制
        缺省的采用系统自带的主键生成机制,
        外步程序可以覆盖系统主键生成机制
        由值来决定
        auto:自动,一般在生产环境下采用该种模式,
               解决了单个应用并发访问数据库添加记录产生冲突的问题,效率高,如果生产环境下有多个应用并发访问同一数据库时,必须采用composite模式
        composite:结合自动和实时从数据库中获取最大的主键值两种方式来处理,开发环境下建议采用该种模式,
                   解决了多个应用同时访问数据库添加记录时产生冲突的问题,效率相对较低, 如果生产环境下有多个应用并发访问同一数据库时,必须采用composite模式
    -->
    <keygenerate>composite</keygenerate>

	<!--poolman的日志信息输出改用log4j来输出到日志文件,相关的配置见log4j.properties文件-->
    <!--<logFile>dbaccess.log</logFile>
    <debugging>true</debugging>-->
    <!-- 请求链接时等待时间,单位:秒
    客服端程序请求链接等待时间超过指定值时,后台包等待超时异常
     -->
    <maxWait>60</maxWait>
    
    <!-- 
    	链接有效性检查sql语句
     -->
    <validationQuery>select 1</validationQuery>
    
    <autoprimarykey>false</autoprimarykey>
	<showsql>false</showsql>

  </datasource>
  
  <datasource>

    <dbname>bspf_custom_1</dbname>
	<loadmetadata>false</loadmetadata>
    <jndiName>jdbc/mysql-ds-1</jndiName>
    <driver>com.mysql.jdbc.Driver</driver>

     <url>jdbc:mysql://172.16.25.139:3306/cim</url> 

    <username>root</username>
    <password>123456</password>

    <txIsolationLevel>READ_COMMITTED</txIsolationLevel>

    <nativeResults>true</nativeResults>

    <poolPreparedStatements>false</poolPreparedStatements>

    <initialConnections>2</initialConnections>
    
    <minimumSize>0</minimumSize>
    <maximumSize>10</maximumSize>
	<!--控制connection达到maximumSize是否允许再创建新的connection
		true:允许,缺省值
		false:不允许-->
    <maximumSoft>false</maximumSoft>
    
    <!-- 
    是否检测超时链接(事务超时链接)
    true-检测,如果检测到有事务超时的链接,系统将强制回收(释放)该链接
    false-不检测,默认值
     -->
    <removeAbandoned>true</removeAbandoned>
	<!--
		链接使用超时时间(事务超时时间)
		单位:秒
	-->
    <userTimeout>50</userTimeout>
    <!-- 
    	系统强制回收链接时,是否输出后台日志
    	true-输出,默认值
    	false-不输出
     -->
    <logAbandoned>true</logAbandoned>
    
    <!-- 
    	数据库会话是否是readonly,缺省为false
     -->
    <readOnly>false</readOnly>
	
	<!--
		对应属性:timeBetweenEvictionRunsMillis
		the amount of time (in milliseconds) to sleep between examining idle objects for eviction 
	-->
	<skimmerFrequency>10</skimmerFrequency>
	<!--对应于minEvictableIdleTimeMillis 属性:
	minEvictableIdleTimeMillis the minimum number of milliseconds 
	an object can sit idle in the pool before it is eligable for evcition
	单位:秒
	
	空闲链接回收时间,空闲时间超过指定的值时,将被回收
	-->
	<connectionTimeout>60</connectionTimeout>
	<!--
	numTestsPerEvictionRun 
	the number of idle objects to 
	examine per run within the idle object eviction thread (if any)
	
	每次回收的链接个数 
	-->
    <shrinkBy>5</shrinkBy>
    <!--
    /**
     * 检测空闲链接处理时,是否对空闲链接进行有效性检查控制开关
     * true-检查,都检查到有无效链接时,直接销毁无效链接
     * false-不检查,缺省值
     */
     -->
    <testWhileidle>true</testWhileidle>


    <!--
        定义数据库主键生成机制
        缺省的采用系统自带的主键生成机制,
        外步程序可以覆盖系统主键生成机制
        由值来决定
        auto:自动,一般在生产环境下采用该种模式,
               解决了单个应用并发访问数据库添加记录产生冲突的问题,效率高,如果生产环境下有多个应用并发访问同一数据库时,必须采用composite模式
        composite:结合自动和实时从数据库中获取最大的主键值两种方式来处理,开发环境下建议采用该种模式,
                   解决了多个应用同时访问数据库添加记录时产生冲突的问题,效率相对较低, 如果生产环境下有多个应用并发访问同一数据库时,必须采用composite模式
    -->
    <keygenerate>composite</keygenerate>

	<!--poolman的日志信息输出改用log4j来输出到日志文件,相关的配置见log4j.properties文件-->
    <!--<logFile>dbaccess.log</logFile>
    <debugging>true</debugging>-->
    <!-- 请求链接时等待时间,单位:秒
    客服端程序请求链接等待时间超过指定值时,后台包等待超时异常
     -->
    <maxWait>60</maxWait>
    
    <!-- 
    	链接有效性检查sql语句
     -->
    <validationQuery>select 1</validationQuery>
    
    <autoprimarykey>false</autoprimarykey>
	<showsql>false</showsql>

  </datasource>
  
  <datasource external="true">

    <dbname>mq</dbname>
    <externaljndiName>jdbc/mysql-ds</externaljndiName>
	<showsql>false</showsql>

  </datasource>
  
 <datasource external="true">

    <dbname>kettle</dbname>
    <externaljndiName>jdbc/mysql-ds</externaljndiName>
	<showsql>false</showsql>

 </datasource>
  


</poolman>
1 楼 yin_bp 2011-06-29  
欢迎大家一起交流,呵呵

相关推荐

    SpringMVC +Mybatis 多个数据源配置 DEMO + maven

    本DEMO演示了如何在SpringMVC和Mybatis框架中配置多个数据源,并结合Maven进行项目管理,提供了一个实际操作的参考。 首先,我们需要了解SpringMVC和Mybatis的基础。SpringMVC是Spring框架的一部分,主要用于处理...

    ssm实现多数据源配置

    1. **配置文件设置**:首先,你需要在`applicationContext.xml`或`mybatis-config.xml`中定义多个数据源。通常,我们会使用`org.springframework.jdbc.datasource.DriverManagerDataSource`或`...

    springmvc_mybatis_多数据源

    总结来说,"springmvc_mybatis_多数据源"项目展示了如何在SpringMVC和MyBatis框架下有效地管理和使用多个数据源。这涉及到Spring的事务管理、数据源路由、MyBatis的配置等多个方面,对于理解和实践企业级应用开发中...

    Spring+SpringMVC+Mybatis动态链接多数据源

    1. **配置数据源**:首先,你需要配置多个数据源,可以使用Spring的AbstractRoutingDataSource作为基础,该类可以根据某种路由策略(如线程本地变量、请求参数等)动态选择数据源。 2. **定义路由逻辑**:创建一个...

    动态切换多数据源

    在JavaWeb开发中,"动态切换多数据源"是一个重要的技术点,特别是在大型企业级应用中,为了实现数据的高可用性、隔离性和扩展性,往往需要接入多个数据库。本项目是一个基于Eclipse、MyBatis和Mysql的多数据源示例,...

    mybatis+spring实现动态切换数据源

    1. **配置Spring**:首先,我们需要在Spring的配置文件中声明多个数据源。这些数据源可以是JDBC的DataSource实例,如Apache的DBCP或C3P0。每个数据源都有其特定的数据库连接信息,例如URL、用户名和密码。 ```xml ...

    SpringBoot多数据源案例

    如果你使用Mybatis作为持久层框架,需要为每个数据源创建单独的`SqlSessionFactory`和`MapperScannerConfigurer`。你可以通过`@MapperScan`注解指定每个数据源对应的Mapper接口包。 4. **切换数据源**: 为了方便...

    SpringBoot+mybatis+Druid 运行时动态多数据源

    在现代企业级应用开发中,数据源管理是一个关键部分,特别是在需要访问多个数据库的应用中。SpringBoot、MyBatis和Druid的组合提供了一个高效且灵活的解决方案,尤其是在实现运行时动态多数据源方面。本篇文章将深入...

    springmvc+mybatis多数据源,aop动态切换

    在SpringMVC+MyBatis的项目中,可以使用Spring的DataSourceTransactionManager来管理多个数据源。首先,需要配置两个数据源,分别为读库和写库。接着,通过@Qualifier注解指定在Service层中使用的具体数据源。 **...

    springboot + mybatis 多数据源demo

    - **Mapper配置**:为每个数据源创建对应的Mapper配置,确保MyBatis知道要使用哪个数据源执行SQL。这可以通过在Mapper接口上添加自定义注解实现,如`@MapperDS("primary")`或`@MapperDS("secondary")`。 - **...

    java简单分布式架构,多个数据源,线程池多线程访问

    本项目围绕“Java简单分布式架构,多个数据源,线程池多线程访问”这一主题展开,旨在通过利用Java技术栈实现一个高效的分布式系统。 首先,我们关注的是“分布式”这一概念。分布式系统是由多台计算机通过网络连接...

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    1. **数据源配置**:在Spring配置文件中,我们需要定义多个数据源bean,每个数据源对应一个数据库连接。这可能包括Druid或HikariCP这样的连接池配置。 2. **动态数据源**:Spring的AbstractRoutingDataSource类允许...

    springboot mybatis使用动态数据源的例子

    - 配置数据源:在`application.properties`或`application.yml`中,定义多个数据源配置,例如`datasource.primary.url`、`datasource.primary.username`等。 - 自定义路由数据源:创建一个继承自`...

    springboot整合mybatis多数据源动态配置 swagger

    - 配置多个数据源:定义DataSource bean,通过条件注解实现读写分离。 - 配置MyBatis:配置MyBatis的相关bean,包括SqlSessionFactory和MapperScannerConfigurer。 - 配置Swagger:创建Docket bean,定义API的元...

    SpringBoot+Mybatis多数据源demo

    每个数据源对应一个DataSource,SpringBoot可以通过@ConfigurationProperties注解,从application.properties或application.yml文件中读取配置,创建多个数据源。 AOP(Aspect Oriented Programming)面向切面编程...

    springboot druid maven多数据源(mysql+SqlServer)

    SpringBoot允许我们轻松配置和管理多个数据源,通过Spring的DataJPA或MyBatis等持久层框架实现对不同数据库的操作。 1. **SpringBoot集成Druid**:Druid是一个开源的数据库连接池,它不仅提供了优秀的性能,还具备...

    SpringBoot多数据源动态切换源码

    在多数据源环境中,应用需要连接并操作多个不同的数据库。在Spring Boot中,可以通过配置不同的DataSource bean来实现。每个数据源可以配置独立的URL、用户名和密码,以满足不同业务的需求。 4. **动态数据源切换*...

    spring boot多数据源配置

    为每个数据源创建对应的实体类和仓库接口,例如`PrimaryUser`、`PrimaryUserService`、`PrimaryUserRepository`。 四、配置Mapper 1. 添加MyBatis依赖 如果你使用MyBatis作为持久层框架,确保引入MyBatis和MyBatis...

    spring boot + mybatis(通用mapper) druid多数据源切换配置

    1. **配置数据源**:在Spring Boot的配置文件(application.properties或application.yml)中,定义多个数据源的相关配置,如数据库URL、用户名、密码等。 2. **动态数据源切换**:使用Spring的`...

    myBatis多数据源配置

    在多数据源配置中,我们需要定义多个数据源,以便根据业务需求选择合适的数据库进行操作。 Spring Boot 提供了对多数据源配置的良好支持。配置多数据源主要涉及以下几个步骤: 1. **引入依赖**:在项目中添加 ...

Global site tag (gtag.js) - Google Analytics