Arbeitsspeicherverbrauch duch SQL-Abfrage in Macro

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Arbeitsspeicherverbrauch duch SQL-Abfrage in Macro

Re: Arbeitsspeicherverbrauch duch SQL-Abfrage in Macro

von DPunch » Do, 03.02.2011 14:04

Aloha
Gast hat geschrieben:Kann man denn SQL-Abfragen (an eine MSSQL-Datenbank) starten ohne das die Datenbank registriert ist ?
Ja, kann man.
In Deinem Fall würde das ganz einfach so aussehen:

Code: Alles auswählen

	oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
	sName = "file://xxx.odb"
	oDatenquelle = oBaseContext.getByName(sName)
	oDatenquelle.setLoginTimeout( 10 ) ' sekunden
	oVerbindung = oDatenquelle.getConnection( "xxx", xxx )
Gast hat geschrieben:Die Lebensdauer einer Variable endet doch mit dem Macroende, oder liege ich da falsch?
Wenn sie nicht als globale Variable definiert ist, endet die Lebensspanne spätestens mit dem Macroende, das stimmt.
Die meisten sterben sogar mit dem Prozedurende, darauf wollte ich hinaus.
Wenn Du nun die SQL-Abfragen in eine eigene Prozedur auslagerst, kann, muss aber nicht, das eventuell dabei behilflich sein, dass der Speicher sofort wieder frei gegeben wird.
Also nach dem Prinzip:

Code: Alles auswählen

Sub Main
	oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
	sName = "file://xxx.odb"
	oDatenquelle = oBaseContext.getByName(sName)
	oDatenquelle.setLoginTimeout( 10 ) ' sekunden
	oVerbindung = oDatenquelle.getConnection( "xxx", xxx )
	oStatement = oVerbindung.createStatement()
	
	Dim aAbfragen(9) as String '10 Abfragen
	aAbfragen(0) = "select xxx"
	aAbfragen(1) = "select yyy"
	'usw
	For i = 1 To 100 '100 Projekte
		For Each Abfrage in aAbfragen
			SQLAbfrage(oStatement,Abfrage)
		Next Abfrage
	Next i
End Sub

Sub SQLAbfrage(ByRef oStatement as Object,ByVal SQLString as String)
	Dim oResult as Object
	oResult = oStatement.executeQuery(SQLString)
	While oResultSet.Next()
	    xxx    = val(oResultSet.getString(1))
	   ' usw.
	Wend
End Sub
Ob das tatsächlich Linderung verschafft, kann ich Dir nicht mit Sicherheit sagen, aber ich könnte es mir gut vorstellen.
Abgesehen davon sollte der Vorgang allein schon dadurch schneller sein, dass keine überflüssigen Schritte jedes Mal aufs neue wiederholt werden.

Re: Arbeitsspeicherverbrauch duch SQL-Abfrage in Macro

von DPunch » Di, 01.02.2011 16:48

Aloha
bma2000 hat geschrieben:Kann man OO dazu bringen beim starten eines Macros den Speicher zu leeren oder zwischendurch Variablen zu leeren um den Speicherverbrauch einzugrenzen ?
Das kannst Du prinzipiell auch selber machen, über die Lebensdauer von Variablen.
Wie, wo und in welchem Zusammenhang werden die Makrodurchläufe denn aufgerufen? Steht alles in einer Prozedur? Wird für die SQL-Statements eine eigene Prozedur verwendet?
Baust Du jedes Mal eine neue Verbindung zur Datenbank auf? Musst Du die Datenbank registrieren, wenn Du sowieso nur per Makro ein SQL-Statement absetzen willst?

Ein etwas detailreicherer Codeausschnitt würde den Versuch der Hilfestellung auf jeden Fall erleichtern.

Arbeitsspeicherverbrauch duch SQL-Abfrage in Macro

von bma2000 » Do, 27.01.2011 09:01

Guten Morgen!

Ich habe mehere Macros die viele Datenbankabfragen durchführen und auswerten!
Mein Problem: Der Arbeitsspeicherverbrauch von soffice.bin steigt bei der Ausführung des Macros (gefühlt mit jeder SQL-Abfrage) an und auch wenn man das Macro neu startet wird der Speicherverbrauch nicht weniger sonder steigt mit jeder Ausführung weiter an. Bis um die 600 MB verbraucht sind, dann steigt OOo teilweise ohne Fehler einfach aus. (oder z.B. [msci_uno bridge errer] UNO type of C++ exception unknows: "std.bad_alloc", RTTI-name=".=AVbad_alloc@std@@"!.) bei 675.196k

Kann man OO dazu bringen beim starten eines Macros den Speicher zu leeren oder zwischendurch Variablen zu leeren um den Speicherverbrauch einzugrenzen ?

Mein System: WinXp 32Bit, OOo 3.2.1 und LibreOffice 3.3.0

Code: Alles auswählen

Codeteile:

' Datenbank registrieren
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
sName = "file://xxx.odb"
if oBaseContext.hasByName("xxx") then oBaseContext.revokeObject("xxx")
oDataSource = oBaseContext.getByName(sName)
oBaseContext.registerObject("xxx", oDataSource)

oDatenbankKontext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )
oDatenquelle = oDatenbankKontext.getByName( "xxx" )
oDatenquelle.setLoginTimeout( 10 ) ' sekunden
oVerbindung = oDatenquelle.getConnection( "xxx", xxx )

' DB Abfragen
sSQL = "select xxx " 
oStatement = oVerbindung.createStatement()
oResultSet = oStatement.executeQuery( sSQL )

While oResultSet.Next()
    xxx    = val(oResultSet.getString(1))
    usw. 
Wend
oResultSet.close()
oStatement.close()

' DB wieder rauslöschen
if oBaseContext.hasByName("xxx") then oBaseContext.revokeObject("xxx")
Pro Durchlauf gibt es ca. 10 SQL-Abfragen und pro Macrostart bis zu 100 Durchläufe.
Mir kommt es so vor, das er die Rückgaben der Datenbankabfrage also o.ResultSet im Speicher behält.

Danke schon mal im Vorraus.
Bernhard

Nach oben