ソースデータ項目のSSMの複数

プロジェクトでは、多くの問題は、モジュールのいくつかは、別のデータベースクエリにリンクする必要があり、そして、あなたは、2つのデータソースを操作するように構成することができます。

1. jdbc.propertiesを作成します。

= JDBC jdbc.url:MySQLの:// localhostの:? 3306 / test1の真&characterEncoding useUnicode = = UTF8に
jdbc.driver =はcom.mysql.jdbc.Driver
jdbc.username =ルート
jdbc.password = 123


##秒のデータリンク
JDBC = JDBC .url2:MySQLの://192.168.1.57:?3306 / =真useUnicodeにテスト&characterEncoding = UTF8
jdbc.driver2 =はcom.mysql.jdbc.Driver
jdbc.username2 =ルート
jdbc.password2 = 123
2.現在使用されているデータを取得しますソース

org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSourceインポート;
/ **
* <P> DESC:複数のデータソース</ P>
* <P>クラス名:DynamicDataSource </ P>
* <P>初出: 2018年7月10日9時38分42秒のaM </ P>
* <P> @author:MMY </ P>
* /
AbstractRoutingDataSourceを拡張DynamicDataSourceパブリッククラス{

保護determineCurrentLookupKeyオブジェクト(){
DBContextHolder.getDbType()を返します;
}

}
3.データソースツールを切り替えます。

/ **
* <p型> DESC:スイッチデータソース</ P>
* <p型>クラス名:DBContextHolder </ P>
* <p型>作成:2018年7月10日9時39分24秒AM </ P >
* <P> @author:MMY </ P>
* /
publicクラスDBContextHolder {

プライベート静的最終ThreadLocalの<ストリング> =新しい新しいContextHolder ThreadLocalの<ストリング>();
パブリック静的ボイドsetDbType(文字列のdbType){
contextHolder.set(のdbType );
}

公共の静的な文字列getDbType(){
リターン((文字列)contextHolder.get());
}

パブリック静的ボイドclearDbType(){
contextHolder.remove();
}

}
4.構成プロファイル春

< -第一步:!配置数据源- >
<文脈:プロパティプレースホルダ位置= "クラスパス:jdbc.properties" />
<ビーンID = "dataSource1"クラス= "com.mchange.v2.c3p0.ComboPooledDataSource ">
<プロパティ名=" jdbcUrlと」値= "$ {jdbc.url}"> </ property>の
<プロパティ名= "driverClass"値= "$ {jdbc.driver}"> </ property>の
<プロパティ名= "ユーザ"値= "$ {jdbc.username}"> </ property>の
<プロパティ名= "パスワード"値= "$ {jdbc.password}"> </ property>の
</ビーン>

<ビーンID = "dataSource2 "クラス=" com.mchange.v2.c3p0.ComboPooledDataSource ">
<プロパティ名=" jdbcUrlと"値=" $ {JDBC。URL2} "> </ property>の
<プロパティ名=" driverClass」値= "$ {jdbc.driver2}"> </ property>の
<プロパティ名= "ユーザ"値= "$ {jdbc.username2}"> </プロパティ>
<プロパティ名= "パスワード"値= "$ {jdbc.password2}"> </ property>の
</豆>

<! -配置多数据源- >
<beanクラス= "com.ocean.utils.DynamicDataSource" ID = "dynamicDataSource">
<プロパティ名= "targetDataSources">
<マップキー型= "java.lang.Stringで">
<エントリ値-REF = "dataSource1"キー= "dataSource1"> </ entry>の
<エントリ値-ref = "dataSource2"キー= "dataSource2"> </ entry>の
</ MAP>
</ property>の
<プロパティ名= "defaultTargetDataSource" REF = "dataSource1"> </ property>の
</豆>


<! -创建sqlSessionFactory - >
<ビーンID = "sqlSessionFactory"クラス= "org.mybatis.spring.SqlSessionFactoryBean">
<プロパティ名= "データソース" REF = "dynamicDataSource"> </プロパティ>
<プロパティ名=「configLocation」値は=「CLASSPATH:SqlMapConfig.xml」> </プロパティ>
</豆>
<! -インターフェイスコンフィギュレーションMyBatisのエージェントの開発
*インタフェースのクラス名とのマッピングファイルが同じ名前でなければなりません
*インターフェイスクラスとマッピングファイルがでなければなりません同じディレクトリ
*名前空間のマッピングファイル名がクラスのインタフェースのフルパス名でなければなりません
*インターフェイスメソッド名とIDマッピング声明は一貫していなければならない
- >
<! - <beanクラス=「org.mybatis.spring.mapper.MapperScannerConfigurer ">
<プロパティ名=" basePackage "値=" com.ocean.mapper "> </プロパティ>
<プロパティ名=" sqlSessionFactoryBeanName "値=" SqlSessionFactory「> </プロパティ>
</豆> - >

<! - -統合の構成は一般的なマッパーを変更し実行する必要があります- >
< -オリジナルの完全なクラス名:! org.mybatis.spring.mapper.MapperScannerConfigurer - >
<!- 一般マッパー使用:tk.mybatis.spring.mapper.MapperScannerConfigurer - >
<beanクラス= "tk.mybatis.spring.mapper.MapperScannerConfigurer">
<プロパティ名= "basePackage"値= "com.ocean.mapper" />
<プロパティ名= "プロパティ">
<値>
= trueにenumAsSimpleType
</値>
</プロパティ>
</豆>


<! -総務- >
<豆上記ID = "のTransactionManager"クラス= "org.springframework.jdbc.datasource.DataSourceTransactionManager">
<プロパティ名= "データソース" REF =「dynamicDataSource "> </プロパティ>
</ beanが>

<が-になっ総務ノート- >!
<TX:トランザクション・ドリブン・注釈マネージャー="のTransactionManager「/>
ここでは、一般的なマッパーを使用して、追加の2つのJARをインポートする必要がありますパッケージ。

ジェネリックマッパーは、私たちは他の操作のための基本的なCRUD操作を実行することができます、あなたはその後の.xmlに設定することができます

例としては、次のとおりです:

 

<?xml version = "1.0"エンコード= "UTF-8"?>
<DOCTYPEマッパーPUBLIC! " - // mybatis.org//DTDマッパー3.0 // EN"「http://mybatis.org/dtd/mybatis -3- mapper.dtd」>
<名前空間マッパー= "com.ocean.mapper.UserMapper">
<このresultMap ID = "BaseResultMap"タイプ= "com.ocean.po.User">
<IDカラム= "ID"プロパティ= "ID" jdbcType = "INTEGER" />
<結果列= "ユーザ名"プロパティ= "ユーザ名" jdbcType = "VARCHAR" />
<結果列= "パスワード"プロパティ= "パスワード" jdbcType = "VARCHAR" />
<結果列= "ニックネーム"プロパティ= "ニックネーム" jdbcType = "VARCHAR" />
<結果カラム= "CREATE_TIME"プロパティ= "CREATETIME" jdbcType = "TIMESTAMP" />
<結果カラム= "UPDATE_TIME"プロパティ= "updateTime" jdbcType = "TIMESTAMP" />
<結果カラム= "qy_flag"プロパティ= "qyFlag" jdbcType = "VARCHAR" />
</このresultMap>

<SELECT ID = "findOne" ParameterTypeが= "java.lang.Integerの"このresultMap = "BaseResultMap">
SELECT *ユーザここからID =#{ID}
</選択>

</マッパー>
4.使用测试

注意:デフォルトのデータソースがdataSource1あり、使用の設定は必要ありません。あなたがdataSource2を使用する必要がある場合は、宣言する必要があり、使用が完了した後に終了する必要があります。

findByIdユーザパブリック(整数ID){
ユーザーユーザー= userMapper.selectByPrimaryKey(ID);
戻りユーザー;
}
/ **
*テスト2番目のデータソースの使用
* /
パブリックfindId2ユーザ(整数ID){
// =ユーザーユーザーUserMapper。 selectByPrimaryKey(ID);
//データベース2に呼び出し
DBContextHolder.setDbType( "DataSource2");
ユーザーユーザー= userMapper.findOne(ID);
DBContextHolder.clearDbType(); //閉じる
リターンユーザー;
}
 

結果は以下の通りであります

 

 

 

ちなみに、以下の印刷SQLの方法は、構成ファイルsqlMapConfig.xmlのMyBatisの単語に加え

<設定>
- < -印刷クエリー!>
<名前= "logImpl"値= "STDOUT_LOGGING"を設定/>
</設定>
キー:問題を発見し、以下を参照:トランザクションが設定されていない、質問は次のとおりです。問題のapplication.xmlおよびSpringmvc.xmlノートのスキャン設定。

要約の下:データソースおよび関連事項の注釈を確認するために、別の名前でContextLoadListener applicationContext.xmlをまたはXMLファイルを使用する場合に春がロードされ、トランザクション特性を開始します。ファイルは、通常のBean定義がロードされているだけのようにSpringmvc.xmlロードされた場合。だから、良い習慣、階層構造に関連するBeanです。applicationContext.xmlを構成データベース関連ビーン(DAO、サービス、等)、spingmvcにおけるMVC構成関連の豆(コントローラ、等)。

総務を追加した後、我々はそれが頭痛の種である、データ・ソースを切り替えることができないことがわかりました。Baiduの様々な、最終的に問題を発見しました。

質問:開いているトランザクションは、データ・ソースの切り替えは、開いているトランザクションの前に実行する必要がある、データソーススイッチに障害が発生した開くようにつながるの間に、トランザクション後のサービスで、一般的に開かれています。

ソリューション:呼び出しが完了した後、層-サービスは、データソースを切り替え、呼び出し、コントローラ、データソース、およびコントローラの電源を切る前に。
---------------------

おすすめ

転載: www.cnblogs.com/ly570/p/11183008.html