Realisierung verschiedener Datenspeicherungen

Status
Nicht offen für weitere Antworten.

clemson

Bekanntes Mitglied
Hallo!

Also, ich werde mal die Überschrift etwas präzisieren: Ich entwickle derzeit eine Web-Applikation basieren auf dem MVC-Prinzip (in Struts). Grob gesagt handelt es sich um eine Applikation, welche Aufträge und deren Auftragsgegenstände, Kunden, Mails, etc. verwaltet.

Momentan wird die ganze Speicherung der Aufträge mittels einer Oracle-DB realisiert. Dazu habe ich verschiedene Manager-Klassen implementiert, welche für die Speicherung der einzelnen Daten verantwortlich sind - so gibt es beispielsweise eine Klasse "OrderManager" welche Methoden zur Manipulation von Aufträgen (engl. order ;) ) bereitstellt (Auftrag bearbeiten, erstellen, löschen, suchen in Aufträgen, ...). Des weiteren gibt es noch Manager zur Manipulation von Auftragsgegenständen, Kunden etc. pp.

Meine Frage ist nun, wie würdet ihr das realiseren, dass ich sozusagen mehrere Datenquellen zur Verfügung stellen kann? Beispielsweise eine Datenquelle welche die Daten in einer Oracle-DB speichert, eine Datenquelle welche die Daten in einer MySQL-DB speichert (welche beispielsweise eine andere Tabellenstruktur besitzt).

Ich habe da an ein Interface "Model" gedacht, welches die verschiedenen Methoden implementiert...

Code:
public interface Model {
      public Order getOrder(String order_number);
      ...
      public Customer getCustomer(String customer_id);
      ...
      public OrderItem[] getOrderItem(String order_number);
      ...
}

des weiteren gibt es eine Factory, welche die gewünschte Datenquelle bereitstellt

Code:
public class ModelFactory {

	public final static String	ORACLE_MODEL	= "oracle_source";

	public final static String	MYSQL_MODEL		= "mysql_source";


	public static Model getModel( String data_source )
			throws ModelNotFoundException {
		if (ORACLE_MODEL.equals(data_source)) {
			return new OracleModel();
		}

		if (MYSQL_MODEL.equals(data_source)) {
			return new MySQLModel();
		}

		throw new ModelNotFoundException("model ["+data_source+"] not found!");
	}
}



wenn ich das ganze so lösen würde, dann würde das Interface "Model" ziemlich viele Methoden definieren...

wie würdet ihr das lösen?
 
B

Beni

Gast
Ich kenne mich mit DB's nicht aus, deshalb bitte mit Vorsicht geniessen: Aber bietet JDBC nicht bereits ein Interfaces das für alle DB's gleich ist?

Ansonsten würde ich das so bauen, wie du es schon vorgeschlagen hast.
 

robertpic71

Bekanntes Mitglied
Also die Methoden wie "getOrder" usw. komplett je DB zu proggen finde ich etwas übertrieben. Ein einfaches Daten holen via SELECT schaut im Normalfall bei allen Datenbanken gleich aus.

Wenn man sich auf die Befehle SQL-ANSI-92-Norm beschränkt, verstehen das fast alle Datenbanken. Solange man keine DB-spezifischen Features nutzt, gibt es nur wenig Unterschiede. Abgesehen davon gibt es noch kleine Stolperfallen, wie z.B. den scrollable Cursor, den die API anbietet, aber nicht jeder JDBC-Treiber unterstützt...


Wenn man sich mit den SQL-Dialekten nicht herumschlagen will, kann man eine Ebene dazwischen schieben. Dazu bietet sich Hibernate an. Hier gibt es XML-Mapping für die Datenbank, bei welcher man auch gleich den die Datenbank und den SQL-Dialekt einstellen. Außerdem werden noch Klassen für die Dateien angelegt (siehe Doku).

Beim Proggen arbeitet man (ähnlich deinem Lösungweg) nur mehr mit dem Modell.

Code:
sess = sessionFactory.openSession();
      trx  = sess.beginTransaction();
      Kunde kunde = new Kunde();
      kunde.setDatum( new Date() );
      kunde.setName( name );
      kunde.setOrt( ort );
      try {
        kunde.setPlz( Integer.parseInt( plz ) );
      } catch( Exception ex ) {
      }
      [b]sess.save( kunde );[/b]
      [b] trx.commit();[/b]

Hier noch ein interessanter Thread aus dem Forum.

Hibernate bietet auch Tools an, seine DB zu einer anderen DB zu portieren.
 

André Uhres

Top Contributor
robertpic71 hat gesagt.:
Ein einfaches Daten holen via SELECT schaut im Normalfall bei allen Datenbanken gleich aus.
Hier geht es ja nicht primär um verschiedene Datenbanken (Oracle/MySQL) sondern vielmehr um verschiedene Datenstrukturen. In der einen Struktur mag der Auftrag in der Tabelle "Order" gespeichert sein mit alphabetischem Schlüssel "OrderNumber", in der anderen vielleicht in der Tabelle "Auftrag" mit numerischem Schlüssel "AuftragNummer" und in der Tabelle "AuftragErweiterung"...
 

robertpic71

Bekanntes Mitglied
Andre_Uhres hat gesagt.:
Hier geht es ja nicht primär um verschiedene Datenbanken (Oracle/MySQL) sondern vielmehr um verschiedene Datenstrukturen. ...

Dieser Eindruck entstand bei mir aber, da im Code das Modell aufgrund der Datenbank ausgewählt wird und nicht aufgrund eines anderen Kriteriums (ERP-Datenstruktur).

Ein gewisser Grad an Abweichung läßt sich im Hibernate-Mapping ausgleichen, aber bei komplett unterschiedlichen Datenbeständen gibt es sicher einiges mehr aufzulösen...
 

Bleiglanz

Gesperrter Benutzer
angenommen dein ganzer SQL Code ist wäre portabel

=> verpass dem Webcontainer eine Injektion (genannt DataSource), die du dir dann über den JNDI Baum abholst

auf diese Art und Weise kannst du den Quelltext vollkommen frei halten von der tatsächlich verwendeten DB

leider ist das bei dir nicht der Fall

aber mach das trotzdem mit der Datasource, und besorg dir über die MetaDaten (getVendor()) die tatsächlich verwendete DB und verwende dann eine Factory wie von dir schon vorgeschlagen


aber

prinzipiell ist das Mist: du sollst eine App schreiben, die Daten in verschiedenen DBs persisitieren soll UND

diese DB haben verschiedene Schemas (Tabellendefinitionen)

watn dass für eine Anforderung??
 

André Uhres

Top Contributor
Bleiglanz hat gesagt.:
...du sollst eine App schreiben, die Daten in verschiedenen DBs persisitieren soll UND
diese DB haben verschiedene Schemas (Tabellendefinitionen)
watn dass für eine Anforderung??
Könnte vielleicht eine Art "Übergangszeit" sein wo für das alte System noch Aufträge angenommen werden müssen,
aber das neue auch schon laufen soll :wink:
Aber ehrlich gesagt finde ich es auch etwas komisch ???:L
 

clemson

Bekanntes Mitglied
hallo, ich melde mich auch einmal zu wort.. ;)

erstmal danke für die zahlreichen und informativen antworten! die frage, die hier aufgetaucht ist, warum denn das ganze mit der verschiedenen datenquellen. ich wollte mich nur mal informieren, wie ich denn das ganze lösen könnte, damit die art der daten-speicherung keine rolle mehr spielt (beispielsweise, wenn jemand keine db zur verfügung hat, und alles in separaten dateien speichern will?)

natürlich ist eine db effizienter als eine db; aber mich hätte nur grundsätzlich interessiert, wie man das ganze noch weiter abstraheren kann (und meine derzeitige lösung wäre das mit dem interface model).

ich hab mal irgendwas gelesen, dass die anzahl der methoden in einer klasse / einem interface beschränkt sind... wisst ihr da mehr?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben