iBatis reconnect

Status
Nicht offen für weitere Antworten.

PollerJava

Top Contributor
Ich verwende iBatis für den DatenBank- Zugriff,
Weiß jemand, wie ich ein reconnect mit iBatis machen kann ohne das Programm neu zu starten?

lg
 

PollerJava

Top Contributor
Weiß dazu niemand etwas?
Ich "verbinde" mich mit iBatis so in einer Klasse:

Code:
 static {
                String resource = "DBXML/SqlMapConfig.xml";
                Reader reader = Resources.getResourceAsReader(resource);
                sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
}

Wie wird das bei anderen Anwendungen gemacht mit der Datenbank, verbindet sich die Application da auch wieder Automatisch mit der DB oder was ist da der Standard?

Bin für jede Schriftmeldung dankbar,

lg
 

PollerJava

Top Contributor
Bin in dieser Hinsicht jetzt auch normal geworden und versuche er auch in der XML- Datei zu konfigurieren,
:wink:

lg
 

PollerJava

Top Contributor
Also ich habe das Tutorial und das Handbuch von oben durchgearbeitet, bin mir aber jetzt nicht sicher, ob ich das richtige gefunden habe, Im Tutorial steht auf jeden Fall nichts drinnen, wie man sich wieder verbinden kann, im Handbuch vermute ich mal, dass es "Pool.PingQuery" sein könnte aber von einem "reconnect steht in den 2 Manuals nichts drinnen,
Ich will ja nicht nur anPingen sondern auch gleich wiederverbinden.


Liege ich da richtig, dass es sich um Pool.PingQuery handelt,
Funktionierts mit dem ?

Wäre Euch sehr dankbar, wenn Ihr mir nochmal weiterhelfen könntet,

Vielen Dank für Eure Bemühungen,

lg
 
T

tuxedo

Gast
Wie immer: Hirn einschalten und "Probieren geht über studieren".

PingQuery wird, ohne dass ich's ausprobiert habe, kenne das aber von MySQL so, ein Feature sein, mit dem die Verbindung dauerhaft aufrecht erhalten wird. Damit brauchst du kein ReConnect, weil die Verbindung gar nicht erst abgebaut wird.

- Alex
 

DocRandom

Top Contributor
... Im Tutorial steht auf jeden Fall nichts drinnen, wie man sich wieder verbinden kann ...
...hmm, also mein englisch ist zwar das mieseste das es gibt, jedoch bin ich auf Seite 42 des Entwicklerhandbuches auf folgendes gestoßen:
Caching Mapped Statement Results
The results from a Query Mapped Statement can be cached simply by specifying the cacheModel parameter
in the statement tag (seen above). A cache model is a configured cache that is defined within your SQL
map. Cache models are configured using the cacheModel element as follows:
<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”cache-size” value=”1000” />
</cacheModel>
The cache model above will create an instance of a cache named “product-cache” that uses a Least Recently
Used (LRU) implementation. The value of the type attribute is either a fully qualified class name, or an
alias for one of the included implementations (see below). Based on the flush elements specified within the
cache model, this cache will be flushed every 24 hours. There can be only one flush interval element and it
can be set using hours, minutes, seconds or milliseconds. In addition the cache will be completely flushed
whenever the insertProduct, updateProduct, or deleteProduct mapped statements are executed. There can
be any number of “flush on execute” elements specified for a cache. Some cache implementations may
need additional properties, such as the ‘cache-size’ property demonstrated above. In the case of the LRU
cache, the size determines the number of entries to store in the cache. Once a cache model is configured,
you can specify the cache model to be used by a mapped statement, for example:
<select id=”getProductList” cacheModel=”product-cache”>
select * from PRODUCT where PRD_CAT_ID = #value#
</select>
..da heißt es zwar nicht explicit reconnect, jedoch was verstehst Du unter Caching Mapped?
Weiters ist der Abschnitt:
Based on the flush elements specified within the
cache model, this cache will be flushed every 24 hours. There can be only one flush interval element and it
can be set using hours, minutes, seconds or milliseconds. In addition the cache will be completely flushed
whenever the insertProduct, updateProduct, or deleteProduct mapped statements are executed. There can
be any number of “flush on execute” elements specified for a cache.
..nochmals hervorgehoben!

lg
DocRandom
 
T

tuxedo

Gast
Ein weiterer interessanter Punkt:

Code:
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>

Wieso einen Reconnect machen wenn iBatis das Pooling beherrscht und mit mehreren Verbindungen arbeitet die es selbstständig verwaltet?

- Alex
 

PollerJava

Top Contributor
es geht mir ja nur darum, wenn ich kurzfristig keine Verbindung mehr übers Netzwerk zur Datenbank habe, dass sich nach der Unterbrechung die Verbindung wieder selbständig zur Datenbank aufbaut,

Momentan bekomme ich folgende Fehlermeldung, wenn ich das Netzwerkkabel ausstecke:

Code:
Fehler in der Klasse DBReader beim Auslesen aus der AlarmTabelle: com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in DBXML/DBAlarmeReadBean.xml.  
--- The error occurred while executing query.  
--- Check the    		SELECT 			KOMMEN   		as kommen, 			GEHEN 	
		as gehen, 			QUIT 			as quit, 			ALARMNR 		as alarmNr, 			VAR1			as var1, 			VAR2 			as var2 	
	FROM Alarme 		WHERE KOMMEN BETWEEN ? AND ? ORDER BY KOMMEN 	.  
--- Check the SQL Statement (preparation failed).  
--- Cause: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544721. Unable to complete network request to host "".
Reason: Unable to complete network request to host "".
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544721. Unable to complete network request to host "".
Reason: Unable to complete network request to host "".

und wenn ichs wieder einstecke dann gehts so weiter mit den Fehlermeldungen,




Meine Config-Datei schaut so aus:

Code:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig 
  PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" 
  "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
  
<sqlMapConfig>
<properties resource="DBXML/DatenbankKonfig.properties" />
	<settings
		cacheModelsEnabled		="true"
		enhancementEnabled		="true"
		lazyLoadingEnabled		="true"
		maxRequests				="20"
		maxSessions				="10"
		maxTransactions			="5"
		useStatementNamespaces	="false"
		statementCachingEnabled	="true"
		classInfoCacheEnabled	="true"
	/>
	<transactionManager type="JDBC" >
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" 					value="${driver}"	/>
			<property name="JDBC.ConnectionURL" 			value="${url}"		/>
			<property name="JDBC.Username" 					value="${username}"	/>
			<property name="JDBC.Password" 					value="${password}"	/>
			<property name="JDBC.DefaultAutoCommit" 		value="true" />
			<property name="Pool.MaximumActiveConnections" 	value="10"/>
			<property name="Pool.MaximumIdleConnections" 	value="5"/>
			<property name="Pool.MaximumCheckoutTime" 		value="120000"/>
			<property name="Pool.TimeToWait" 				value="500"/>
			<property name="Pool.PingQuery" 				value="select 1 from ACCOUNT"/>
			<property name="Pool.PingEnabled" 				value="false"/>
			<property name="Pool.PingConnectionsOlderThan" 	value="1"/>
			<property name="Pool.PingConnectionsNotUsedFor" value="1"/>
		</dataSource>
	</transactionManager>
<sqlMap resource="DBXML/DBWertReadBean.xml" />  
<sqlMap resource="DBXML/DBAlarmeReadBean.xml" />
</sqlMapConfig>
 
T

tuxedo

Gast
Hmm, du könntest doch beim auftreten der Exception im Catch-Block einfach

Code:
resource = "DBXML/SqlMapConfig.xml";
reader = Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);

ausführen und so die entsprechenden Objekte neu instanziieren, womit ibatis die Verbindung eh komplett neu aufbaut.

Ist halt die HardCore Methode. Aber ne andere seh ich im Moment nicht. Zeig doch aber mal n bisschen Code um die Zeile drum rum, die den Fehler auslöst...

- Alex
 

PollerJava

Top Contributor
Morgen,

Ja, das dachte ich mir auch, deshalb habe ich mir einen JButton auf meiner Applikation gemacht und wenn ich diesen drücke, wird folgende Methode aufgerufen (also das gleiche wie beim Starten, XML- Datei lesen usw.):

Code:
 private static SqlMapClient sqlMap;
...
try {
                String resource = "DBXML/SqlMapConfig.xml";
                reader = Resources.getResourceAsReader(resource);
                sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
                } 
            catch (Exception e) 
                {
// hier gebe ich eine Fehlermeldung aus (catch ist nicht leer)
}

Das Auslesen geht bei mir so:

Code:
wa.setZeitstempel1(new Timestamp(new Date(calendar.getTimeInMillis()).getTime()));
                        wa.setZeitstempel2(new Timestamp(aktuell.getTime()));                            
                        alarmeList = sqlMap.queryForList("getAlarme", wa);

Und hier bekomme ich eben folgende Fehlermeldung

Code:
Fehler in der Klasse DBReader beim Auslesen aus der AlarmTabelle: com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in DBXML/DBAlarmeReadBean.xml.  
--- The error occurred while executing query.  
--- Check the    		SELECT 			KOMMEN   		as kommen, 			
GEHEN 			as gehen, 			QUIT 			as quit, 			ALARMNR 		as alarmNr, 			VAR1			as var1, 			VAR2 			
as var2 		FROM Alarme 		WHERE KOMMEN BETWEEN ? AND ? ORDER BY KOMMEN 	.  
--- Check the SQL Statement (preparation failed).  
--- Cause: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544721. Unable to complete network request to host "".
Reason: Unable to complete network request to host "".
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544721. Unable to complete network request to host "".
Reason: Unable to complete network request to host "".


Ehrlich gesagt wäre es mir egal, obs eine saubere Lösung ist oder nicht, all zu oft sollte es sowieso nicht vorkommen, dass das Netzwerk ausfällt aber irgendwie sollte es halt möglich sein,

Also meiner Meinung muss es an der sqlMap liegen, die erfängt sich nicht mehr aber wie ich das lösen kann, ist mir ein Rätsel,

Vielen Dank auf jeden Fall für Eure Tipps,

lg
 

PollerJava

Top Contributor
Ich hole mir in den anderen Klassen einmalig eine Instanz von sqlMap mit der Methode unten,

Code:
protected static SqlMapClient getSqlMapInstance () 
        {
        return sqlMap;
        }

und verwende diese dann in den verschiedenen Klassen,

Kann es sein, das die Klassen nur eine Kopie von sqlMap haben und deshalb das ganze nicht mehr funktioniert?

lg
 

PollerJava

Top Contributor
ja das wars, ich schreibe jetzt nicht einmal in der Klasse



Code:
private SqlMapClient sqlMap = AppSqlConfig.getSqlMapInstance();

und verwenden dann sqlMap, sondern schreibe immer

Code:
AppSqlConfig.getSqlMapInstance();

Vielen Dank für Eure Hilfe,

lg
 
T

tuxedo

Gast
Mach doch in der Klasse, in der du "getSqlMapInstance()" drin hast, eine Methode "getNewSqlMapInstance()", welche du dann bei einer solchen Exception aufrufst.

- Alex
 

PollerJava

Top Contributor
Ja könnte ich auch machen,
ist das was ich jetzt gemacht habe, vom Konzept her nicht OK??
geht das nicht irgendwie in der XML- Datei auch, dass alle 3 Minuten die Verbindung neu hergestellt wird??

lg
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben