XyzdbStartStop implements LifecycleListener reagiert auf Lifecycle.START_EVENT und Lifecycle.STOP_EVENT; beim Start wird Server.createTcpServer mit passenden TCP-Optionen ausgeführt und eine globale Ressource „xyz/db“ bereitgestellt; beim Stopp wird per SQL-Befehl ein „SHUTDOWN“ ausgelöst und die globale Ressource abgebaut
XyzdbLink implements LifecycleListener reagiert auch auf Lifecycle.START_EVENT und Lifecycle.STOP_EVENT; beim Start wird die globale Ressource „xyz/db“ als lokale „xyzdb“gebunden; beim Stopp wird entbunden
die Webapp nutzt die lokale Ressource „xyzdb“
Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); Xyzdb db = (Xyzdb) envCtx.lookup("xyzdb"); |
beim Loader muss „delegate“ gleich „true“ sein, damit die Ressource korrekt bereitgestellt werden kann
siehe auch https://stackoverflow.com
<!-- context.xml --> <Resource name="jdbc/xyz" auth="Container" type="javax.sql.DataSource" driverClassName="com.ibm.db2.jcc.DB2Driver" username="admin" password="geheim" maxActive="20" maxIdle="10" maxWait="-1" url="jdbc:db2://{servername}:50000/{dbname}" /> |
InitialContext ic = new InitialContext(); var dsName = "java:comp/env/jdbc/xyz"; var ds = (javax.sql.DataSource) ic.lookup(dsName); try (var conn = ds.getConnection()) { // ... } |
Datenbank per JSTL nutzen
<% // lokale Einstellungen für Datenbankverbindung holen Properties props = AppUtil.lookForProperties(); ResourceText query = ResourceText.fromJar(props.getProperty("sql")); %> <%-- Konfiguration --%> <c:set var="dbDriver"><%= props.get("driver") %></c:set> <c:set var="dbUrl"><%= props.get("url") %></c:set> <c:set var="dbUser"><%= props.get("user") %></c:set> <c:set var="dbPass"><%= props.get("pass") %></c:set> <c:set var="abfrage"><%= props.get("sql") %></c:set> <sql:setDataSource var = "db" driver = "${dbDriver}" url = "${dbUrl}" user = "${dbUser}" password = "${dbPass}"/> <%-- SQL-Abfrage --%> <sql:query dataSource="${db}" var="result"> <%= query.text() %> </sql:query> <c:if test="${fn:length(result.rows) eq 0}"> <p>Keine Daten!</p> </c:if> <c:forEach var="x" items="${result.rows}" varStatus="loop"> ${x.abcd} </c:forEach> |
connection throwing abandon exception
github: JakartaDbStarter
programmatically datasource
CIF2: programmatisch (alt)
in XyzMain wird H2-Server gestartet (keine Bereitstellung als Ressource, Zugriff über JDBC, Einstellungen aus lokaler Konfiguration und Systemumgebung)
CIF2: programmatisch + XML-Konfiguration
a) server.addLifecycleListener(new XyzdbStartStop()) in XyzMain startet H2-Server und stellt globale Ressource bereit
b) <Listener className=“net.btmx.mboee.XyzdbLink“ /> in webapp/META-INF/context.xml erstellt Ressourcen-Link für Webapp
CIF3: XML-Konfiguration
a) server.xml mit <Listener className=“net.btmx.mboee.GlobalDatasourceCreator“ /> startet H2-Server und stellt globale Ressource bereit
b) context.xml mit <Listener className=“net.btmx.mboee.AppDatasourceLinkCreator“ /> erstellt einen Ressoucen-Link in der Webapp
XYZDEV: programmatisch
ctx.addLifecycleListener(new net.btmx.bree.AppDbServer()) in XyzMain startet H2-Server und stellt Ressource mit Factory in Webapp bereit (Factory liefert Datenbank-Ressource als SingleTon)