Heim  >  Artikel  >  Java  >  Springs Lösung zum dynamischen Wechseln mehrerer Datenquellen

Springs Lösung zum dynamischen Wechseln mehrerer Datenquellen

高洛峰
高洛峰Original
2017-01-24 10:44:201651Durchsuche

Vorwort

Spring konfiguriert mehrere Datenquellen dynamisch, dh die Aufteilung von Daten in große Anwendungen und die Verwendung mehrerer Datenbankinstanzen für die Verwaltung, wodurch die horizontale Skalierbarkeit des Systems effektiv verbessert werden kann. Eine solche Lösung unterscheidet sich von der herkömmlichen Einzeldateninstanzlösung, bei der das Programm während der Laufzeit basierend auf der aktuellen Anforderung und dem Systemstatus dynamisch entscheiden muss, in welcher Datenbankinstanz die Daten gespeichert und aus welcher Datenbank die Daten extrahiert werden sollen.

Spring 2.x und spätere Versionen verwenden den Proxy-Modus. Dies bedeutet, dass wir eine virtuelle Datenquelle in der Lösung implementieren und diese zum Kapseln der Datenquellenauswahllogik verwenden, sodass die Datenquellenauswahllogik effektiv sein kann übertragen von getrennt vom Kunden. Der Client stellt den für die Auswahl erforderlichen Kontext bereit (da dieser vom Client bekannt ist) und die virtuelle DataSource implementiert die Auswahl der Datenquelle basierend auf dem vom Client bereitgestellten Kontext.

Implementierung

Die spezifische Implementierung besteht darin, dass die virtuelle DataSource nur AbstractRoutingDataSource erben muss, um discoverCurrentLookupKey() zu implementieren, in dem die Auswahllogik der Datenquelle gekapselt ist.

1. Konfigurieren Sie mehrere Datenquellen dynamisch

1. Datenquellennamen-Konstantenklasse:

/**
 * 动态配置多数据源
 * 数据源的名称常量类
 * @author LONGHUI_LUO
 *
 */
public class DataSourceConst {
 public static final String TEST="test";
 public static final String USER="User";
}


2. Erstellen Sie eine Klasse zum Abrufen und Festlegen der Kontextumgebung, die hauptsächlich für die Änderung des Namens der Kontextdatenquelle verantwortlich ist:

/**
 * 获得和设置上下文环境 主要负责改变上下文数据源的名称
 *
 * @author LONGHUI_LUO
 *
 */
public class DataSourceContextHolder {
 private static final ThreadLocal contextHolder = new ThreadLocal(); // 线程本地环境
  
 // 设置数据源类型
 public static void setDataSourceType(String dataSourceType) {
  contextHolder.set(dataSourceType);
 }
  
 // 获取数据源类型
 public static String getDataSourceType() {
  return (String) contextHolder.get();
 }
  
 // 清除数据源类型
 public static void clearDataSourceType() {
  contextHolder.remove();
 }
  
}


3. Beachten Sie, dass diese Klasse AbstractRoutingDataSource erben und die Methode „determineCurrentLookupKey“ implementieren muss. Diese Methode gibt ein Objekt zurück, normalerweise eine Zeichenfolge:

/**
 * 建立动态数据源
 *
 * @author LONGHUI_LUO
 *
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
  
 protected Object determineCurrentLookupKey() {
 // 在进行DAO操作前,通过上下文环境变量,获得数据源的类型
 return DataSourceContextHolder.getDataSourceType();
 }
  
}


4. Schreiben Sie Federkonfigurationsdateien, um mehrere Datenquellen zu konfigurieren

  <!-- 数据源相同的内容 -->
<bean
  id="parentDataSource"
  class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property
   name="driverClassName"
   value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
  <property name="username" value="sa" />
  <property name="password" value="net2com" />
</bean>
<!-- start以下配置各个数据源的特性 -->
<bean parent="parentDataSource" id="testDataSource">
  <propertynamepropertyname="url" value="jdbc:sqlserver://localhost:1433;databaseName=test" />
</bean>
<bean parent="parentDataSource" id="UserDataSource">
   <property
   name="url"
   value="jdbc:sqlserver://localhost:1433;databaseName=User" />
</bean>
<!-- end 配置各个数据源的特性 -->

5 Die Spring-Konfigurationsdatei konfiguriert mehrere Datenquellen-Zuordnungsbeziehungen


<bean class="com.xxxx.datasouce.DynamicDataSource" id="dataSource">
 <property name="targetDataSources">
  <map key-type="java.lang.String">
   <entry value-ref="testDataSource" key="test"></entry>
   <entry value-ref="UserDataSource" key="User"></entry>
  </map>
 </property>
 <property name="defaultTargetDataSource" ref="testDataSource" ></property>
</bean>

In dieser Konfiguration konfiguriert das erste Eigenschaftsattribut die Zieldatenquelle 94e2018ae9965fd907426239a3d5ffad muss mit dem Werttyp in der statischen Schlüsselwert-Vergleichsklasse 03a16bda00387cdab8041fd4bcdf3fa8-Tags konfigurieren. Das zweite Eigenschaftsattribut konfiguriert die Standarddatenquelle.


Dynamisches Umschalten ist die Datenquelle

Es wird unter dem Spring-Framework gelöst. Die Datenquelle ist weiterhin in der Spring-Konfigurationsdatei konfiguriert und die sessionFactory konfiguriert weiterhin ihr dataSource-Attribut. Es weiß nicht einmal von der Änderung der Datenquelle. Der einzige Unterschied besteht darin, dass zwischen der echten DataSource und der SessionFactory eine MultiDataSource hinzugefügt wird.

DataSourceContextHolder.setDataSourceType(DataSourceConst.TEST);
Zweitens ist es einfach zu implementieren und leicht zu warten. Obwohl ich so viel über diesen Plan gesagt habe, handelt es sich eigentlich nur um eine Analyse. Der einzige Code, den wir wirklich schreiben müssen, ist MultiDataSource und SpObserver. Die einzigen zwei Methoden, die wirklich in der MultiDataSource-Klasse geschrieben werden müssen, sind getDataSource() und getDataSource(sp), während die SpObserver-Klasse noch einfacher ist. Je einfacher die Implementierung, desto geringer ist die Fehlerwahrscheinlichkeit und desto höher ist die Wartbarkeit.

Schließlich kann diese Lösung eine einzelne Datenquelle mit mehreren Datenquellen kompatibel machen. Diese Lösung hat keinerlei Auswirkungen auf das Schreiben von BUS und DAO. Wenn unser Projekt zu Beginn mit einer einzigen Datenquelle entwickelt wird und im Verlauf des Projekts auf mehrere Datenquellen umgestellt werden muss, müssen wir nur die Federkonfiguration und einige kleine Änderungen an der MVC-Ebene ändern, um die erforderlichen Daten zu schreiben Im Datenquellennamen ist die Änderung abgeschlossen. Wenn unser Projekt wieder auf eine einzelne Datenquelle umstellen möchte, müssen wir lediglich die Konfigurationsdatei ändern. Dies wird unserem Projekt mehr Flexibilität verleihen.

Nachteile dieser Lösung

Sie löst nicht das Problem der gemeinsamen Nutzung der Variable „dataSource“, wenn mehrere Benutzer auf den Singleton „sessionFactory“ zugreifen, was zu einem Konflikt um „ führt. dataSource“, das im Wesentlichen dem „Produzenten-Konsumenten“-Problem in Betriebssystemen ähnelt. Daher kann es beim Zugriff mehrerer Benutzer auf mehrere Datenquellen zu einer verringerten Systemleistung kommen.

Zusammenfassung


Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels für alle beim Lernen oder bei der Arbeit hilfreich sein kann eine Botschaft zum Mitteilen.

Weitere Artikel zur Spring-Lösung zum dynamischen Wechseln mehrerer Datenquellen finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn