Ibatis 数据源的动态配置之二

本文介绍了一种通过Properties动态配置SqlMapClient的方式,解决了多线程环境下因文件IO导致的数据源配置混乱问题。该方法利用com.ibatis.sqlmap.client.SqlMapClientBuilder的buildSqlMapClient方法,将数据库连接信息作为参数传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在之前写的那篇Ibatis 数据源的动态配置里,提到了使用动态写入配置文件(.properties文件)方式来动态配置数据源,起初这个方法还行,因为只有一个任务来写,然后读配置文件,但是当读写的工作设计到两个或者更多的线程后,这种方案的弊端就暴露出来了,文件IO占用的时间使得后面的线程读到的是其他线程的配置,搞得天下大乱。所以,多番研究之后,找到了另一种方式,可以说这种方法比前者优越得多,在多数情况下(保守估计),完全可以取代前面的方法,废话少说,配置如下:

 

      故事的根源就是com.ibatis.sqlmap.client.SqlMapClientBuilder这个类,它是用来从给定的资源(如XML配置文件)中构造一个SqlMapClient的实例的,它旗下有四个静态方法(参考文档),这次用到的这个方法是:

    

public static SqlMapClient buildSqlMapClient(java.io.Reader reader,  java.util.Properties props)

参数中:reader用于读取sql-map-config.xml,这个常见, 而这个props参数则可以用来包含sql-map-config.xml中所需要的参数,它是最关键的,可以将数据库连接所需的URL,用户名,密码用props动态传入。

 

sql-map-config.xml 配置:(省去了前一种方案用到的properties设置)

<sqlMapConfig>

<!-- properties value="misp/migrate/database.properties" -->

<settings      
cacheModelsEnabled="true"     
enhancementEnabled="true"     
lazyLoadingEnabled="true"     
maxRequests="32"     
maxSessions="10"     
maxTransactions="5"     
useStatementNamespaces="false" 
/>  


<transactionManager type="JDBC">   
  <dataSource type="SIMPLE">   
  <property value="oracle.jdbc.driver.OracleDriver" name="JDBC.Driver"/>   
  <property value="${url}" name="JDBC.ConnectionURL"/>   
  <property value="${username}" name="JDBC.Username"/>   
  <property value="${password}" name="JDBC.Password"/>   
  </dataSource>   
</transactionManager> 

 

 

获得SqlMapClient实例的java代码:

public static SqlMapClient getSqlClient(Properties pro) throws IOException
	{			
		Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader ("misp/migrate/sql-map-config.xml");
		
		sqlClient = SqlMapClientBuilder.buildSqlMapClient(reader,pro);	
		return sqlClient;
		
	}

 

在某个线程需要自己的SqlMapClient时,将URL等信息写入到Properties 里,然后获取一个SqlMapClient实例,然后将这个实例作为变量传入自己需要的地方。避免了多个线程去读同一个连接配置文件带来的尴尬。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值