Heim Java javaLernprogramm Springs Lösung zum dynamischen Wechseln mehrerer Datenquellen

Springs Lösung zum dynamischen Wechseln mehrerer Datenquellen

Jan 24, 2017 am 10:44 AM

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";
}
Nach dem Login kopieren


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();
 }
  
}
Nach dem Login kopieren


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();
 }
  
}
Nach dem Login kopieren


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 配置各个数据源的特性 -->
Nach dem Login kopieren

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>
Nach dem Login kopieren

In dieser Konfiguration konfiguriert das erste Eigenschaftsattribut die Zieldatenquelle muss mit dem Werttyp in der statischen Schlüsselwert-Vergleichsklasse -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);
Nach dem Login kopieren
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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Apr 19, 2025 pm 04:51 PM

Fehlerbehebung und Lösungen für die Sicherheitssoftware des Unternehmens, die dazu führt, dass einige Anwendungen nicht ordnungsgemäß funktionieren. Viele Unternehmen werden Sicherheitssoftware bereitstellen, um die interne Netzwerksicherheit zu gewährleisten. ...

Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Apr 19, 2025 pm 11:42 PM

Bei Verwendung von MyBatis-Plus oder anderen ORM-Frameworks für Datenbankvorgänge müssen häufig Abfragebedingungen basierend auf dem Attributnamen der Entitätsklasse erstellt werden. Wenn Sie jedes Mal manuell ...

Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Apr 19, 2025 pm 06:21 PM

Die Verarbeitung von Feldzuordnungen im Systemdocken stößt häufig auf ein schwieriges Problem bei der Durchführung von Systemdocken: So kartieren Sie die Schnittstellenfelder des Systems und ...

Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Apr 19, 2025 pm 11:45 PM

Beginnen Sie den Frühling mit der Intellijideaultimate -Version ...

Wie kann ich elegant den variablen Entitätsklassennamen erstellen, wenn Tkmybatis für Datenbankabfrage verwendet werden? Wie kann ich elegant den variablen Entitätsklassennamen erstellen, wenn Tkmybatis für Datenbankabfrage verwendet werden? Apr 19, 2025 pm 09:51 PM

Wenn Sie TKMybatis für Datenbankabfragen verwenden, ist das Aufbau von Abfragebedingungen ein häufiges Problem. Dieser Artikel wird ...

Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Apr 19, 2025 pm 11:30 PM

Lösungen zum Umwandeln von Namen in Zahlen zur Implementierung der Sortierung in vielen Anwendungsszenarien müssen Benutzer möglicherweise in Gruppen sortieren, insbesondere in einem ...

Wie kann ich Java -Objekte sicher in Arrays umwandeln? Wie kann ich Java -Objekte sicher in Arrays umwandeln? Apr 19, 2025 pm 11:33 PM

Konvertierung von Java-Objekten und -Arrays: Eingehende Diskussion der Risiken und korrekten Methoden zur Konvertierung des Guss-Typs Viele Java-Anfänger werden auf die Umwandlung eines Objekts in ein Array stoßen ...

E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? Apr 19, 2025 pm 11:27 PM

Detaillierte Erläuterung des Designs von SKU- und SPU-Tabellen auf E-Commerce-Plattformen In diesem Artikel werden die Datenbankdesignprobleme von SKU und SPU in E-Commerce-Plattformen erörtert, insbesondere wie man mit benutzerdefinierten Verkäufen umgeht ...

See all articles