日期:2014-05-16  浏览次数:20823 次

mysql、imformix动态数据源配置

? 因需要语言类型来动态选择对应的数据源,所以把自己处理的过程写下来,以备忘。

? 1、把informix数据库驱动放在MAVEN中,在pom.xml中配置,把informix数据库驱动加载到本地

? 2、在Tomcat的server.xml配置数据源

? ? ?<Resource name="jdbc/InformixDatabase"

? ? ? ? type="javax.sql.DataSource"

? ? ? ? maxIdle="10"

? ? ? ? maxWait="30"

? ? ? ? username="informix"

? ? ? ? password="informix"

? ? ? ? maxActive="100"

? ? ? ? testWhileIdle="true"

? ? ? ? timeBetweenEvictionRunsMillis="60000"

? ? ? ? minEvictableIdleTimeMillis="60000"

? ? ? ? testOnBorrow="true"

? ? ? ? driverClassName="com.informix.jdbc.IfxDriver"

? ? ? ? user="jdbc:informix-sqli://url:host/tradepage2:INFORMIXSERVER=db1_tcp;NEWCODESET=big5,cp1252,819;CONNECTIONRETRYCOUNT=10;CONNECTIONRETRYDELAY=2;LOGINTIMEOUT=2"/>

? ?3、编写DbContextHolder是获得和设置上下文的类:

? ? ? ?public class DbContextHolder{

? ? ? ? ? private static final ThreadLocal contextHolder = new ThreadLocal();

?

? ? ? ? ? public static void setDbType(String dbType){

? ? ? ? ? ? ?contextHolder.set(dbType);

? ? ? ? ? }

?

? ? ? ? ? public static String getDbType(){

? ? ? ? ? ? ?return (String)contextHolder.get();

? ? ? ? ? }

?

? ? ? ? ? public static void clearDbType(){

? ? ? ? ? ? ?contextHolder.remove();

? ? ? ? ? }

? ? ? ?}

?

? ? 4、建立动态数据源类,须继承AbstractRoutingDataSource:

? ? ? ?public class DynamicDataSource extends AbstractRoutingDataSource {

protected Object determineCurrentLookupKey() {

return CustomerContextHolder.getCustomerType();

}

}

?5、编写spring配置文件配置多数据源映射关系

? ?<jee:jndi-lookup id="EN_US" jndi-name="java:comp/env/jdbc/MysqlDatabase"/>

? ?<jee:jndi-lookup id="ZH_TW" jndi-name="java:comp/env/jdbc/InformixDatabase"/>

?

? ? <bean id="ttnetDataSource" ?class="org.DynamicDataSource">

? ? ? ?<property name="targetDataSources">

? ? ? ? ? <map key-type="java.lang.String">

? ? ? ? ? ? <entry key="EN_US" value-ref="EN_US"/>

? ? ? ? ? ? <entry key="ZH_TW" value-ref="ZH_TW"/>

? ? ? ? ? </map>

? ? ? ?</property>

? ? ? ?<property name="defaultTargetDataSource" ref="EN_US"/>

? ? </bean>

?6、在需要调用的service类中使用如下方式

? ? if("ZH_TW".equals(lanCode))

? ? ? ?DbContextHolder.setDbType("ZH_TW");

? ? else

? ? ? ?DbContextHolder.setDbType("EN_US");

?