# Wie kann ich Datenbankverbindnung global deklarieren?



## Eddie Irvine (15. Aug 2005)

Hallo,

ich habe ein Problem:
Ich habe eine Klasse "Index", in der es zwei Methoden gibt, die eine DB-Abfrage beihnalten. Wenn ich jetzt jedoch in der Methode jeweils eine Verbindung zur DB aufbaue, dann kommt eine Fehlermeldung.
Wenn ich die Connection als Parameter an die Methoden übergebe (wie unten im Quellcode), dann kommt folgende Fehlermedlung:


> Exception in thread "main" com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
> 
> ** BEGIN NESTED EXCEPTION ** .... ....



Jetzt meine Fragen:
1. Kann ich die Verbindung zur DB nicht irgendwie global deklarieren, so dass sie in allen Methoden der Klasse zur Verfügung steht? Hab schon vieles versucht, aber ich habe es nicht hinbekommen...
2. Und noch was: Ist mein Programmierstil so in Ordnung (abgesehen von den fehlenden Kommentaren)? Gibt es da besondere Konventionen (Klammersetzung, Abstand innerhalb runder Klammer etc.)?
3. Braucht man einen leeren Konstruktor (wie hier Index() )?
4. Würdet ihr die Klasse genauso aufbauen?

Bin ein Java-Einsteiger, als habt ein Einsehen 

Vielen Dank schonmal!

Die Klasse ist folgendermaßen aufgebaut (hier etwas vereinfacht, mit Übergabe der Connection als Parameter):

```
import java.io.*;
import java.sql.*;
import java.util.StringTokenizer;

public class Index {
	
	public Index () {
	}
	
	static void create () throws SQLException {
		Connection my_con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/TextMining", "root", "" );
		Statement my_stmt = my_con.createStatement();
		
		String sqlQuery = "SELECT DocID, Title, Short_text, Text FROM `documents`";
		ResultSet rSet = my_stmt.executeQuery( sqlQuery );

		String token = "";
		
		int count = 0;
	    	
		 while ( rSet.next() ) {
			 for (int i=2; i < 5; i++) {
		    	StringTokenizer tokenizer = new StringTokenizer ( rSet.getString(i) );
		    	while ( tokenizer.hasMoreTokens() ) {
		    		token = tokenizer.nextToken();
		    		
		    		token = prepare_token ( token );
		    		
		    		if ( token.length() > 1 && !is_number ( token ) ) {
		    			if ( !is_stopword ( token, my_con ) ) {
		    				if ( !is_duplicate ( token, my_con ) ) {
								count++;
								
								insert_into_Index ( token, rSet.getInt(1), count, my_con );
		    				}
		    			}
		    		}
		    	}
	    	}
	    }
	    my_con.close();
	}
	
	static private String prepare_token ( String token ) {
		
		token = token.replace ( ",", " " );
		token = token.replace ( ".", " " );
		
                //....
		
		return token;
	}
	
	static private boolean is_number( String token ) {
		char numbers[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
		boolean is_number = false;
		  
		for ( int i=0; i < token.length(); i++ ) {
			for ( int j=0; j < numbers.length; j++ ) {
				if ( token.charAt(i)==numbers[j] ) {
					is_number = true;
					break;
				}
			}
		}
		return is_number;
	} //is_number()
	
	static private boolean is_stopword ( String token, Connection my_con ) throws SQLException {
		boolean is_stopword = false;

		String sqlQuery = "SELECT * FROM `stopwords`";
		Statement my_stmt = my_con.createStatement();
		ResultSet rSet4 = my_stmt.executeQuery( sqlQuery );
		
		while( rSet4.next() && !is_stopword ) { 
			//Leerzeichen entfernen
			String help = rSet4.getString( "name" );
			help = help.replace( " ", "" );
			help = help.trim ();
			//System.out.println( help );
		    
			if ( token.equals( help ) ) {
		      //token is a stoppword... is_stoppword wird auf TRUE gesetzt
		      is_stopword = true;
		    }
		}
		return is_stopword;
	}
	
	static private boolean is_duplicate ( String token, Connection my_con ) throws SQLException {
		boolean is_duplicate = false;
		
		Statement my_stmt = my_con.createStatement();
		
		String sqlQuery = "SELECT Concept FROM `index`";
		ResultSet rSet = my_stmt.executeQuery( sqlQuery );
		
		while ( rSet.next() ) {
			if ( token.equals( rSet.getString(1) ) ) {
				is_duplicate = true;
			}
		}
		return is_duplicate;
	}
	
	static private void insert_into_Index ( String token, int docID, int count, Connection my_con ) throws SQLException {
		
		Statement my_stmt = my_con.createStatement();
		
		String InsertString = "INSERT INTO `index` ( ConID, DocID, Concept ) VALUES ('"+count+"', '"+docID+"', '"+token+"') ";
		my_stmt.executeUpdate( InsertString );
	}
}
```


----------



## Eddie Irvine (15. Aug 2005)

Hallo,

ich habe die DB-Verbindung jetzt global deklariert:

```
import java.io.*;
import java.sql.*;
import java.util.StringTokenizer;

public class Index {
	
	static Connection my_con;
	
	public Index () {
	}
        ....
```

Die Connection als Übergabeparameter konnte ich jetzt aus allen Methoden rausnehmen.
Jetzt bekomme ich aber folgende Fehlermeldung:


> Exception in thread "main" java.lang.OutOfMemoryError: Java heap space



Woran kann das liegen?

DANKE.


----------



## TheSunToucher (17. Aug 2005)

Ohne das ich mir den kompletten Quelltext angeschaut habe: Du solltest einige Sache beachten.
Du mußt das Connection-Objekt schließen wenn du es nicht mehr brauchst. Du solltest auch nicht beliebig viele Connections öffnen. Am besten erstellst du einen Connection-Pool, aus dem du dir bei bedarf Connections holst und zurückgeben kannst. Das ist üblich bzw. "best practice" du solltest dazu bespiele im Forum oder bei Google finden.

Gruß
Tim


----------

