# Verbindungsprobleme mit Oracle Datenbank



## tekilla209 (4. Juli 2007)

Hallo Leutz,

ich habe ein Prog. geschrieben, dass mit den wichtigsten gängigen Datenbanken zusammen funktionieren soll.
Jetzt bin ich dabei die Möglichkeit Oracle zu verwenden einzubauen und bekomme schon bei der Verbindung einige Probleme.

Der folgende Code liefert einen Error, mit dem ich nichts anfangen kann (hab leider keine Ahnung von Oracle)


```
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
```

driver = "oracle.jdbc.driver.OracleDriver"
url = "jdbcracle:thin192.168.0.222:1521"

Der Error:

java.sql.SQLException: Listener refused the connection with the following error:
ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
The Connection descriptor used by the client was:
192.168.0.222:1521

	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:380)
	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)
	at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:466)
	at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
	at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:839)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	...

2. Frage: Wie kann ich SHOW DATABASES und SHOW TABLES in Oracle realisieren?
		ich habe gelesen das geht nicht so ohne weiteres. Wie kann ich überhaupt verschiedene Datenbanken auf einem Oracle Server laufen lassen?


PS:
Ich verwende Oracle Express Edition 10g


----------



## MeinerEiner_80 (4. Juli 2007)

Moin!
Ich mag mich täuschen, aber fehlt da nicht noch der Datenbankname in der URL?

url = "jdbcracle:thin192.168.0.222:1521:databaseName"

*grüssle*
MeinerEiner


----------



## tekilla209 (4. Juli 2007)

Danke erstma für die Antwort!

im Prinzip hast Du ja recht, aber ich dachte ich könnte die verbindung est mal so aufbauen und dann ein "SHOW DATABASES" äquivalent benutzen und anschliesent USE databasename machen.

Wie kann ich sehen welche Datenbanken vorhanden sind?
hab bisher nur den Server installiert ohne irgendwelchen Content. Sollte Da nicht immer eine Datenbank namens "system" existieren?
url = "jdbcracle:thin192.168.0.222:1521:system" habe ich schon versucht, ging aber auch net.

Wie kann ich in dem Oracle neue Datenbanken anlegen?
Mit dem Webinterface-Teil kann ich Tabellen anlegen aber unter welchem Datenbanknamen finde ich die dann?


----------



## MeinerEiner_80 (4. Juli 2007)

Wie gesagt, 100% sicher bin ich nicht, aber
das was du willst ist glaub ich nicht so ganz JDBC konform, wird also erstmal nicht untersützt.
Aber eventuell hat dein Orakeltreiber ja ein paar Erweiterungen, die das ermöglichen.
Da musst du mal in die Doku von dem Treiber schauen...

*grüssle*
MeinerEiner


----------



## jgraber (4. Juli 2007)

Hi,



tekilla209 hat gesagt.:


> 2. Frage: Wie kann ich SHOW DATABASES und SHOW TABLES in Oracle realisieren?
> ich habe gelesen das geht nicht so ohne weiteres. Wie kann ich überhaupt verschiedene Datenbanken auf einem Oracle Server laufen lassen?




Ein Show Database wird so weit ich Oracle verstanden habe, nicht möglich sein. Jede DB ist für sich alleine ein abgeschlossenes System. Um auf die Oracle-DB zu kommen, benötigst Du eine SID (System Identifier), die Du beim Verbindungsaufbau angeben musst.

Ein Show table müsste mit "SELECT * FROM ALL_TABLES" (Oder so ähnlich) möglich sein. Habe derzeit keine Oracle-Instanz, auf der ich es testen kann. Mit dem Statement solltest Du aber alle Tabellen zurück bekommen, auf die der User zugreiffen kann (Sowohl die eigenen wie auch die Tabellen anderer User, für die du entsprechende Rechte wie SELECT erhalten hast. 
Alle Tabellen in der DB sind in der Tabelle DBA_TABLES enthalten. Diese Tabelle gehört aber dem Benutzer SYS und ist in der Regel für Benutzer nicht lesbar.

Hoffe damit geholfen zu haben. Sollte ich daneben liegen, würde ich mich über eine entsprechende Rückmeldung freuen.


----------



## tekilla209 (9. Juli 2007)

Danke nochmal für eure Antworten!

Habs jez endlich gerafft. Aber...
So wie ich das verstanden habe gibt es doch nur eine DB pro Server?
Wozu also den Datenbanknamen angeben, wenn doch sowieso nur eine DB existiert?


----------



## MeinerEiner_80 (9. Juli 2007)

tekilla209 hat gesagt.:


> So wie ich das verstanden habe gibt es doch nur eine DB pro Server?


Nee, man kann durchaus mehrere Datenbanken auf einem Server unterbringen..


----------



## tekilla209 (9. Juli 2007)

Also doch wie bei MySQL nur dass es kein "SHOW DATABASES" und auch kein "USE" gibt?
Geht wahrscheinlich nur nicht bei XE, hab zumindest nicht gefunden wo...


----------



## Thomas Darimont (9. Juli 2007)

Hallo,

ja bei Oracle XE gibts die Einschränkung, dass man nur eine Datenbankinstanz auf einem Rechner betreiben kann:


> ...
> The third limit is that only a single XE database can run on any given computer. The important point here is that you don't need a database for each application you create, as you might for some competing databases. Instead, Oracle uses the concept of schemas to separate applications...



http://www.oracle.com/technology/pub/articles/cunningham-database-xe.html

Gruß Tom


----------



## fenerli23 (29. Oktober 2007)

Hi an alle,

wollte per Java auf meine Oracle Database 10g Express zugreifen, jedoch tritt immer wieder ein Fehler auf könnte mir jemand vielleicht weiterhelfen...?

lg



```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.OracleDriver;

class hr
{
	public static void  main(String args[]) 
	{

        try 
        {
        		DriverManager.registerDriver(new OracleDriver());
        }
        catch (SQLException e)
        {
        	System.err.println ("ERROR: Could not register the driver! Exiting ..");
        	e.printStackTrace();
        	Runtime.getRuntime().exit(1);
        }	
        // 1. JDBC-Treiber laden
       // Class.forName("oracle.jdbc.OracleDriver").newInstance();
       

        // Connect zur thinDriver
        Connection thinDriverConnection  = null;
        try
        {
         	  String thinDriverURL = "jdbc:oracle:thin:@remote_machine:1521:remote_xe";
          	  thinDriverConnection = DriverManager.getConnection(
         			  thinDriverURL, "hr", "fenerium");
        }
        catch (SQLException e)
        {
           	System.err.println ("ERROR: Could not register the driver! Exiting ..");
           	e.printStackTrace();
           	Runtime.getRuntime().exit(1);
        }
        finally
        {
        	try
        	{
        		if (thinDriverConnection != null)
        			thinDriverConnection.close();
        	}
        	catch (SQLException ignore) {}
        }
        
        String connectDescriptor = "(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = " +
        		"(PROTOCOL = TCP)(HOST = remote_machine)(PORT = 1521)))(CONNECT-DATA =" +
        		"(SID = REMOTE_XE)))";
        
        //thin Driver connection using a connect descriptor
        try
        {
        	String thinDriverConnectDescriptorURL = "jdbc:oracle:thin:@" + connectDescriptor;
        	
        	thinDriverConnection= DriverManager.getConnection(
       			  thinDriverConnectDescriptorURL, "hr", "fenerium");
        }
        catch (SQLException e)
        {
        	// handle the exception properly -  in this case, we just 
        	// print a message and stack trace and exit the application
           	System.err.println ("ERROR: Could not register the driver! Exiting ..");
           	e.printStackTrace();
           	Runtime.getRuntime().exit(1);
         }
         finally
         {
        	 try
             {
        		 if (thinDriverConnection != null)
                 thinDriverConnection.close();
             }
        	 catch (SQLException ignore) {}
         }        	

         
         // OCI driver connection using a connect descriptor
         Connection ociDriverConnection = null;
         try
         {
         	String ociDriverURL = "jdbc:oracle:oci:@remote_xe"; 
         				         	
         	ociDriverConnection= DriverManager.getConnection(
        			  ociDriverURL, "hr", "fenerium");
         }
         catch (SQLException e)
         {
         	// handle the exception properly -  in this case, we just 
         	// print a message and stack trace and exit the application
           	System.err.println ("ERROR: Could not register the driver! Exiting ..");
           	e.printStackTrace();
           	Runtime.getRuntime().exit(1);
          }
          finally
          {
         	 try
              {
         		 if (ociDriverConnection != null)
                  ociDriverConnection.close();
              }
         	 catch (SQLException ignore) {}
          }    
         
          
          //OCI driver connection using a connect descriptor
          try
          {
        	  String ociDriverConnectDescriptorURL = "jdbc:oracle:oci:@" 
         				+ connectDescriptor;
         	
        	  ociDriverConnection= DriverManager.getConnection(
        			  ociDriverConnectDescriptorURL, "hr", "fenerium");
          }
          catch (SQLException e)
          {
        	  // handle the exception properly -  in this case, we just 
        	  // print a message and stack trace and exit the application
        	  System.err.println ("ERROR: Could not register the driver! Exiting ..");
           	  e.printStackTrace();
           	  Runtime.getRuntime().exit(1);
          }
          finally
          {
         	 try
              {
         		 if (ociDriverConnection != null)
                  ociDriverConnection.close();
              }
         	 catch (SQLException ignore) {}
          }        	
	}
```


----------



## Tobias Köhler (29. Oktober 2007)

Welcher Fehler tritt denn immer auf?
Ich vermute einfach mal, dass er hier liegt:

```
// 1. JDBC-Treiber laden
       // Class.forName("oracle.jdbc.OracleDriver").newInstance();
```
Die Zeile sollte nicht auskommentiert sein, oder?


----------



## fenerli23 (29. Oktober 2007)

Also wie ich das verstehe, stimmt das schon mit dem auskommentieren das ist eine Alternative zu dem hier:

```
try 
        {
        		DriverManager.registerDriver(new OracleDriver());
        }
        catch (SQLException e)
        {
        	System.err.println ("ERROR: Could not register the driver! Exiting ..");
        	e.printStackTrace();
        	Runtime.getRuntime().exit(1);
        }
```

Als Feherl tritt dies auf:

```
ERROR: Could not register the driver! Exiting ..
java.sql.SQLException: E/A-Exception: The Network Adapter could not establish the connection
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
	at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414)
	at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
	at oracle.jdbc.driver.T4CDriverExtension.getConnection
                                              (TCDriverExtension.java35)
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
	at java.sql.DriverManager.getConnection(DriverManager.java:525)
	at java.sql.DriverManager.getConnection(DriverManager.java:171)
	at hr.main(hr.java:31)
```


----------



## MeinerEiner_80 (29. Oktober 2007)

Moin!
In der Java 1.6 Api steht:


> The DriverManager methods getConnection and  getDrivers have been enhanced to support the Java Standard Edition  Service Provider mechanism. JDBC 4.0 Drivers must  include the file META-INF/services/java.sql.Driver. This file contains the name of the JDBC drivers  implementation of java.sql.Driver.  For example, to load the my.sql.Driver class,  the META-INF/services/java.sql.Driver file would contain the entry:


Nutzt du Java 1.6 und ist diese genannte Datei auch vorhanden? Falls nicht muss weiterhin der Treiber explizit mit Class.forName() geladen werden..

*grüssle*
MeinerEiner


----------



## fenerli23 (29. Oktober 2007)

ich nutze java jdk 1.5

ich habe die treiber schon in die classpath eingefügt und wollte nun so die Treiber laden, damit ich auf die Oracle Database zugreifen kann.

Hatte das auch mit class.forName() vorher versucht jedoch trat da immer ein Fehler auf..


lg


----------



## y0dA (29. Oktober 2007)

```
So sollte es funktionieren:
Für USER eben noch das Schema eingeben und für PASSWORD das Passwort (eh klar) :).

try {
			DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@remote_machine:1521:remote_xe", "USER", "PASSWORD");
		} catch (SQLException e) {
			e.printStackTrace();
		}
```


----------



## fenerli23 (29. Oktober 2007)

habe es eben mal mit hineinbezogen hat leider auch nicht geklappt ;( 
danke aber nochmal


----------



## y0dA (29. Oktober 2007)

Welche IDE benutzt du? Falls eclipse benutze mal den Database Explorer und versuche auf die DB zuzugreifen.


----------



## MeinerEiner_80 (29. Oktober 2007)

fenerli23 hat gesagt.:


> i
> Hatte das auch mit class.forName() vorher versucht jedoch trat da immer ein Fehler auf..


Das muss eigentlich auf jeden Fall funktionieren.
Welcher Fehler trat da auf? Vielleicht eine ClassNotFoundException? Das würde nämlich bedeuten, das der Treiber nicht gefunden wird. Wahrscheinlich stimmen da irgendwelche Pfade nicht..

*grüssle*
MeinerEiner


----------



## fenerli23 (29. Oktober 2007)

jep benutze eclips, wie kann ich denn den datatabase explorer nutzen?


----------



## fenerli23 (29. Oktober 2007)

MeinerEiner_80 hat gesagt.:


> Das muss eigentlich auf jeden Fall funktionieren.
> Welcher Fehler trat da auf? Vielleicht eine ClassNotFoundException? Das würde nämlich bedeuten, das der Treiber nicht gefunden wird. Wahrscheinlich stimmen da irgendwelche Pfade nicht..
> 
> *grüssle*
> MeinerEiner




dieser Fehler tritt dann immer auf:


```
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	Unhandled exception type ClassNotFoundException
	Unhandled exception type InstantiationException
	Unhandled exception type IllegalAccessException

	at hr.main(hr.java:23)
```


----------



## y0dA (29. Oktober 2007)

fenerli23 hat gesagt.:


> jep benutze eclips, wie kann ich denn den datatabase explorer nutzen?



Seh grad dass das ein myeclipse feature ist..

Hast du den Oracle Driver im Classpath?


----------



## fenerli23 (29. Oktober 2007)

ich habe im classpath 

ojdbc14.jar
ojdbc14_g.jar
orai18n.jar

diese drei Dateien habe ich reingeladen in die Classpath


----------



## y0dA (29. Oktober 2007)

ojdbc-14 sonst brauchste nichts.

Hast du einen Oracle Client auf deinem Pc ? Sagt dir der Begriff "tnsnames.ora" etwas?


----------



## fenerli23 (29. Oktober 2007)

ich habe auf meinem Rechner die:

Oracle Database 10g Express Edition ...

tnsnames.ora --> 
"(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = " +
        		"(PROTOCOL = TCP)(HOST = remote_machine)(PORT = 1521)))(CONNECT-DATA = (SID = REMOTE_XE)))";


----------



## fenerli23 (29. Oktober 2007)

okay habe eine Verbindung mit der Datenbank hinbekommen erstmal, leider kann ich mit meinem Programm noch nichts an der Datenbank ändern beziehungsweise ausgeben ....

wie müsste ich nun fortgehen?


----------



## fenerli23 (30. Oktober 2007)

wie könnte ich den ein update erzeugen mit jdbc...?


----------



## Tobias Köhler (30. Oktober 2007)

@fenerli23:
Kannst du mir helfen mit der Oracle-Verbindung?^^
Ich schaffe es einfach nicht, eine zu erstellen.... Die JAR hängt schon am Build-Path, es müsste was am Code falsch sein

```
logger.info("Versuche, Verbindung aufzubauen...");		
		try
		{	
	        OracleDataSource ds;
	        ds = new OracleDataSource();
	        ds.setURL("jdbc:oracle:thin:@localhost");
	        Connection conn = ds.getConnection("hr", "hr");
	        
	        Statement stmt = conn.createStatement();
	        String sql = "SELECT * FROM Employees ORDER BY employee_id";
	        logger.info("\nExecuting query: " + sql);
	        ResultSet rSet = stmt.executeQuery(sql);

	        while (rSet.next()) {
	        logger.info(rSet.getInt(1) + " " +
	        		rSet.getString(2) + " " + 
	        		rSet.getString(3) + " " + 
	        		rSet.getString(4));
	        }
	        
	        rSet.close();
	        stmt.close();
	        conn.close();
		}
		catch(SQLException e)
		{
			logger.error("Konnte keine Verbindung herstellen.", e);
		}
```


----------



## Ronin-Jay (30. Oktober 2007)

Ich habe Euch hier mal eine Datenbankklasse rangehängt, die eine Verbindung zu oracle herstellt und mit der man auch Updates und Querys erledigen kann.


```
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import oracle.jdbc.driver.OracleTypes;


/****************************************************************************
 * Database class
 *
 ***************************************************************************/
public final class Database {
	
	/************************************************************************
	 * Private Class. The only instance of Database is created by 'Holder'
	 * on loading.
	 ***********************************************************************/
    private static class Holder {
        private static final Database INSTANCE = new Database();
    }//HOLDER

    
	//declarations
	private String 		dbUser,
						dbPassword,	
						dbUrl,
						dbDriverClass;
	
	private Connection 	con;
	private boolean 	isConnected;
	private Statement 	stmt;
		
	
	/************************************************************************
	 * Constructor
	 * 
	 ***********************************************************************/
	private Database() {
		Settings conf = Settings.getInstance();
		conf.readSettings();

		//get DB-settings
		Vector dbsettings = conf.getDBSettings();
		
		//set db-values
		this.dbUser        = (String) dbsettings.elementAt(0);
		this.dbPassword	   = (String) dbsettings.elementAt(1);
		this.dbUrl		   = (String) dbsettings.elementAt(2);
		this.dbDriverClass = (String) dbsettings.elementAt(3);
		
		connect();
		
	}//Database()
	
	
	/************************************************************************
	 * Static methode 'getInstance()'. Return the only instance of 'Database' 
	 * Implements the Singleton-Design-Pattern.
	 ***********************************************************************/
    public static Database getInstance() {
        return Holder.INSTANCE;
    }//getInstance()
	
	
	/************************************************************************
	 * connect to database. 
	 * 
	 ***********************************************************************/
	private void connect(){
		isConnected = true;
		
		//load driver class into java runtime
	    try {
	    	Class.forName(dbDriverClass);
	    } catch (ClassNotFoundException cnfe) {
	    	System.err.println("Could not find the Oracle driver. " +
	    			           "Check your CLASSPATH. " +cnfe.getMessage());
	    	System.exit(2);
	      }
		
	    //connect to database
	    try {
	    	con  = DriverManager.getConnection(dbUrl,dbUser,dbPassword);
	    	stmt = con.createStatement();
	    } catch (SQLException sqle) {
	    	System.err.println("Could not connect to database: " +
	    			           sqle.getMessage());
		    sqle.printStackTrace();
		    //System.exit(3);
		  }
	}//connect()
	
	
	/************************************************************************
	 * close database-connection
	 * 
	 ***********************************************************************/
	public void close(){
		try {
			con.close();
			isConnected = false;
		} catch(SQLException sqle){};		
	}//close()
	
	
	/************************************************************************
	 * returns the state of database-connection
	 * 
	 ***********************************************************************/
	public boolean isConnected(){
		return isConnected;		
	}//isConnected()
	
	
	/************************************************************************
	 * method to execute SQL-statements
	 * @param String sqlStr
	 * @param boolean isUpdt
	 * @return Resultset rs
	 ***********************************************************************/
	private ResultSet execSQL(String sqlStr, boolean isUpdt) {
		ResultSet rs = null;
		
		//DB-connection established?
		if (!isConnected()) {
	    	System.err.println("Database connection is closed.\n");
	    	return rs;
	    }
		
	    try {
	    	//update- or other SQL-statement 
	    	if (isUpdt) {
	    		//stmt.execute(sqlStr);
	    		stmt.executeUpdate(sqlStr);
	    	} else {
	    		System.out.println("DB Line 170: "+sqlStr);
	    		rs = stmt.executeQuery(sqlStr);
	    	  }
	    } catch (SQLException sqle) {
	    	System.err.println("Check your SQL-Statement_DB174: ");
	    	sqle.printStackTrace();
	      }
	    
	    return rs;
	}//execSQL()
	
	
	/************************************************************************
	 * execute SELECT statement
	 * @param Strin sqlStr
	 ***********************************************************************/
	public ResultSet getResult(String sqlStr) {
	    return execSQL(sqlStr,false);
	}//getResult()
	
	
	/************************************************************************
	 * execute INSERT or UPDATE statement
	 * @param String sqlStr
	 ***********************************************************************/
	public void setCommand(String sqlStr) {
		execSQL(sqlStr,true);
	}//setCommand()
	
	


//=======================================================================
	// help-methods
	//=======================================================================
	
	
	/************************************************************************
	 * help-method to test class and see if settings were imported correctly
	 * 
	 ***********************************************************************/
	public void printInfos(){
		System.out.println("Driverclass:\t" +dbDriverClass);
		System.out.println("User:\t\t" +dbUser);
		System.out.println("PWD:\t\t" +dbPassword);
		System.out.println("URL:\t\t" +dbDriverClass);
	}//printInfos()


}//class
```


----------



## fenerli23 (31. Oktober 2007)

wenn ich dein programm so mal ausfühe bekomme ich ein Fehler bei der Zeile mit dem 
Settings 

```
Settings conf = Settings.getInstance();
```


----------



## Ronin-Jay (31. Oktober 2007)

fenerli23 hat gesagt.:


> wenn ich dein programm so mal ausfühe bekomme ich ein Fehler bei der Zeile mit dem
> Settings
> 
> ```
> ...



Sorry, hatte die Settings.java vergessen. Damit lese ich ein Konfigurationsfile mit allen Infos ein.


```
import java.util.ArrayList;
import java.util.Vector;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;


public final class Settings {
	
	/************************************************************************
	 * Private Class. The only instance of Database is created by 'Holder'
	 * on loading.
	 ***********************************************************************/
    private static class Holder {
        private static final Settings INSTANCE = new Settings();
    }//HOLDER

	
	//Declarations
	private static final String CONF_FILE = "inc/settings";
		
	//Database
	private String 	dbHost,
					dbPort,
					dbUrl,
					dbUser,
					dbPassword,
					dbDriverClass,
					dbOraSid;
	private boolean dbIsThinDriver;
	
	
	//Settings read?
	private boolean readStatus;
	
	
	/************************************************************************
	 * Constructor.
	 * 
	 ***********************************************************************/
	private Settings(){
		this.readStatus = false;
	}//Settings
	
	
	/************************************************************************
	 * Static methode 'getInstance()'. Return the only instance of 'Settings' 
	 * Implements the Singleton-Design-Pattern.
	 ***********************************************************************/
    public static Settings getInstance() {
        return Holder.INSTANCE;
    }//getInstance()
		
	
	/************************************************************************
	 * Opens file and read settings. All informations are stored in local 
	 * private values which can be read with getter - methods.
	 ***********************************************************************/
	public void readSettings(){
		//settings already read ?
		if(!readStatus){
			
			PropertiesConfiguration cfg = null;
			
			//read properties
			try {
				cfg = new PropertiesConfiguration(CONF_FILE);
			} catch (ConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			  }
			
			//set db-values
			this.dbHost		   = (String) cfg.getProperty("DB.Host");
		    this.dbPort   	   = (String) cfg.getProperty("DB.Port");
		    this.dbDriverClass = (String) cfg.getProperty("DB.DriverClass");
		    this.dbOraSid 	   = (String) cfg.getProperty("DB.OraSID");
		    this.dbUser	 	   = (String) cfg.getProperty("DB.User");
		    this.dbPassword    = (String) cfg.getProperty("DB.Password");    
		    
		    //build db-connection URL
		    dbIsThinDriver = cfg.getProperty("DB.DriverType").equals("thin");
		    dbUrl          = "jdbc:oracle:" + (dbIsThinDriver ? "thin:@" + 
		    				 dbHost + ":" + dbPort + ":" + 
		    				 dbOraSid : "oci8:@" + dbOraSid);
		    
		   
			
			readStatus = true;
		}//if		
	}//readSettings()
	
	
	/************************************************************************
	 * Changes settingsvalues in property-file.
	 * @param String name
	 * @param String value 
	 * @return boolean changed
	 ***********************************************************************/
	public boolean changeSetting(String name, String value){
		boolean changed = true;
		
		PropertiesConfiguration cfg = null;
		
		//read properties
		try {
			cfg = new PropertiesConfiguration(CONF_FILE);
		} catch (ConfigurationException e) {
			e.printStackTrace();
		  }
		
		//change property
		cfg.setProperty(name, value);
		
		try {
			//change property value in file
			cfg.save();
		} catch (ConfigurationException e) {
			e.printStackTrace();
			changed = false;
		  }
		
		//initiate to read the settings again to change the values of the
		//running application
		readStatus = false;
		readSettings();
		
		return changed;
	}//changeSetting()
	
	
	/************************************************************************
	 * Returns the DB-Settings (user, password, url, driverclass) as vector.
	 * @return Vector dbsettings
	 ***********************************************************************/
	public Vector getDBSettings(){
		Vector<String> dbSettings = new Vector<String>();
		
		//Fill vector with elements
		dbSettings.addElement(dbUser);
		dbSettings.addElement(dbPassword);
		dbSettings.addElement(dbUrl);
		dbSettings.addElement(dbDriverClass);
		
		return dbSettings;
	}//getDBSettings()
	
	
	
	
	
	
	
	
	
	
	
	//=======================================================================
	// help-methods
	//=======================================================================
	//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
	
	/************************************************************************
	 * Help-Method to test if the settings are read correctly.
	 ***********************************************************************/
	public void printAll(){
		System.out.println("Host: " + dbHost);
		System.out.println("Port: " + dbPort);
		System.out.println("DC: "   + dbDriverClass);
		System.out.println("User: " + dbUser);
		System.out.println("URL: "  + dbUrl);
		System.out.println("PWD: "  + dbPassword +"\n");
		
		
		
	}//printAll()
}//CLASS
```

Ich habe einen Großteil aus der Settings.java rausgelöscht, da er für Dich nicht weiter relevant ist. Daher keine Garantie, daß Du nicht nochmal selber schauen mußt.
Um die Settings-Datei einlesen zu können benötigst Du 'Commons-Cinfigurations' von Apache.

Eine Settingsdatei sieht dann z.B. so aus:

```
#############################################################################
#
# Configuration file for xyz.
#
# (c) Copyright 2007 by Ronin-Jay
#
#############################################################################



#________________________________Database____________________________________

# Enter the name of the machine hosting the database server
DB.Host = localhost
DB.Port = 1521

# Enter the driverclass for the databaseconnection
# e.g. oracle.jdbc.OracleDriver
DB.DriverClass = oracle.jdbc.OracleDriver

# Enter the name of the database instance you are running
DB.OraSID = xe

# DB.DriverType is < thin | oci8 >
DB.DriverType = thin

# DB.User
DB.User = system

# DB.Password
DB.Password = admin
```


----------



## fenerli23 (31. Oktober 2007)

also ich habe den apache tomcat könnte ich damit auch realisieren?


----------



## Ronin-Jay (31. Oktober 2007)

fenerli23 hat gesagt.:


> also ich habe den apache tomcat könnte ich damit auch realisieren?




Sicherlich könntest Du damit auch andere Wege gehen, aber dafür kenne ich mich mit Tomcat nicht aus.

Ich nutze Common Configuration (=> http://commons.apache.org/configuration/) zum Einlesen von Konfigurationsdateien, weil ich darin mehr Möglichkeiten sehe als mit Properties zum Beispiel.


----------



## fenerli23 (7. November 2007)

ich habe jetzt commons configuration downgeloadet muss ich die jar dateien in die classpath einfügen ?

Wo erstelle ich die datei einfach mit einem Texteditor? Und wo lege ich sie ab ?

Danke ...


----------



## Ronin-Jay (7. November 2007)

Ja, die .jar Dateien mußt Du im CLASSPATH mit einbinden.

Die Konfigurationsdatei kannst Du mit einem Texteditor erstellen und wo Du sie ablegst, definierst Du mit:

```
private static final String CONF_FILE = "inc/settings";
```

//edit
Für das Testen der Klasse, mußt Du allerdings nicht zwangsweise mal kurz ne Konfigurationsdatei anlegen. Du kannst die entsprechenden Werte für die Datenbankverbindung auch direkt in den Quelltext schreiben.


----------

