# Datenbank zugriff optimieren - zugriff ohne cursor?



## Splitframe (17. Mrz 2008)

Hallo!

Ich habe ein Datenbank Programm in Java geschrieben und möchte das es schneller läuft.

So sieht das Programmsegment aus:


```
public int Execinput( String sqlstring[], String tbname, String prompt) throws SQLException {
	  SQLError = 0;
	  columnCount =- 1; 

	  int g = 0;
	  try 
	  {
		 
	     
	     

	       /* if (Query != null )
	        {
	           Query.close();
	        }*/
	        Query = dbcon.createStatement();
	        
	           
	           
	        
	            g = 0;
	            while ( g < sqlstring.length )
	            {
	            	
	            	RowsProcessed = Query.executeUpdate("insert into " + tbname + "(" + prompt + ") VALUES (" + sqlstring[g] + ")");	      
	                g++;


	            }
	     
	     } 
	    catch ( ArrayIndexOutOfBoundsException bb )
	    {
	    	System.out.println(" Fertig");
	    }
	    catch ( SQLException dberror) 
	    {
	     Message=dberror.getMessage();
	     SQL.errorcode = Message;
	     SQLError=dberror.getErrorCode();
	     return SQLError;
	    } 
	    finally
	    {
	    	if (DataSet != null) 
	    	{
	    		DataSet.close();
	        }
	        if (Query != null) 
	        {
	    	  Query.close();
	        }
	    }
	  return SQLError;
	  }
```



Wie kann ich das beschleunigen?

Weil es müssen teilweise über 100.000 Einträge gemacht werden...
ich bin noch etwas neu auf dem oracle gebiet...


Thanks in advance


----------



## maki (17. Mrz 2008)

Performance ist nicht dein größtes Problem...

Du scheinst mir auf dem Gebiet von Java, JDBC etc. sehr neu zu sein.

Das hier geht ja mal gar nicht:

```
catch ( ArrayIndexOutOfBoundsException bb )
       {
          System.out.println(" Fertig");
       }
```
Sowas ist echt mies...

Ansonsten:
Variablen, Eigenschaften und Methoden fangen mit einem Kleinbuchstaben an!
Die close() aufrufe sollten in einem eigenen Try/catch block stehen.

Ich persönlich würde ein Insert nie so schreiben, auch nicht so allgemein dass man sowohl den Tabellennamen, die Feldnamen und die Werte als Parameter bekommt...

Wenn du eine Batch benutzt, ist es allein dadurch schon schneller.


----------



## Splitframe (17. Mrz 2008)

Ups das ist übrig geblieben als der code testweise noch so aussah:


```
g = 0;
               while ( g < sqlstring.length )
               {
                  
                  RowsProcessed = Query.executeUpdate("insert into " + tbname + "(" + prompt + ") VALUES (" + sqlstring[g] + ")");        
                   g++;
RowsProcessed = Query.executeUpdate("insert into " + tbname + "(" + prompt + ") VALUES (" + sqlstring[g] + ")");        
                   g++;
RowsProcessed = Query.executeUpdate("insert into " + tbname + "(" + prompt + ") VALUES (" + sqlstring[g] + ")");        
                   g++;
RowsProcessed = Query.executeUpdate("insert into " + tbname + "(" + prompt + ") VALUES (" + sqlstring[g] + ")");        
                   g++;
                  // [...]


               }
```

ich wollte testen ob es schneller geht wenn ich mehrer befehle in einem schleifen Vorgang sende...
Es gibg auch schneller aber unerheblich daher hab ichs wieder raus genommen aber den catchblock vergessen....


Und nein ich benutze keine Batch die Werte werden über die Main Methode übergeben in welcher eben diese Werte vorher ausgelesen werden.


aber zurück zum eigentlichen Thema, kann man auch ohne Cursor insert befehle senden?


----------



## maki (17. Mrz 2008)

Versuche dich mal an der Batch, sollte an sich schon viel helfen.


----------



## Guest (17. Mrz 2008)

Was ist sqlstring und was ist prompt?


----------



## Guest (17. Mrz 2008)

maki hat gesagt.:
			
		

> ...
> Das hier geht ja mal gar nicht:
> 
> ```
> ...


Warum? Wird ja nie ausgeführt.  Ein Obfuscator produziert schöneren Code.  :lol:


----------



## Splitframe (18. Mrz 2008)

prompt beinhaltet in diesem fall die spalten namen in die die werte reinsollen. und im sqlstring array sind die einzelnen werte in dieser form gespeichert:

Wert1 , wert2 , wert3, [...]


----------



## semi (18. Mrz 2008)

Sind das immer wieder unterschiedliche Tabellen? Sind dir diese im Voraus bekannt? Kannst du das ganze nicht 
auf paar PreparedStetements reduzieren und Batch-Updates verwenden? Schon mal SQL-Injection live erlebt?


----------

