You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2022/01/19 21:54:27 UTC

[empire-db] branch version3 updated: optimization

This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch version3
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/version3 by this push:
     new 11c887e  optimization
11c887e is described below

commit 11c887ee7bf88d608153f1dd3935da81cbc2c0fe
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Wed Jan 19 22:54:24 2022 +0100

    optimization
---
 .../jsf2/websample/db/records/EmployeeRecord.java  |  4 +-
 .../empire/jsf2/websample/web/SampleContext.java   | 45 ++++---------
 .../empire/jsf2/websample/web/SampleUtils.java     | 22 -------
 .../jsf2/websample/web/pages/SamplePage.java       |  6 +-
 .../org/apache/empire/jsf2/app/WebDBContext.java   | 75 ++++++++++++++++++++++
 .../apache/empire/db/context/DBContextBase.java    |  8 ++-
 .../apache/empire/db/context/DBContextStatic.java  |  2 -
 7 files changed, 99 insertions(+), 63 deletions(-)

diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
index 076f108..7f95b69 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
@@ -60,7 +60,7 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
             cmd.select(db.T_DEPARTMENTS.DEPARTMENT_ID);
             cmd.select(db.T_DEPARTMENTS.NAME);
             cmd.orderBy(db.T_DEPARTMENTS.NAME);
-            return db.queryOptionList(cmd, SampleUtils.getConnection());
+            return db.queryOptionList(cmd, getContext().getConnection());
         }
         // base class implementation
         return super.getFieldOptions(column);
@@ -71,7 +71,7 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
     {
         DepartmentRecord rec = new DepartmentRecord((SampleContext)getContext());
         SampleDB.TDepartments table = SampleUtils.getDatabase().T_DEPARTMENTS;
-        rec.read(table, this.getInt(T.DEPARTMENT_ID), SampleUtils.getConnection());
+        rec.read(table, this.getInt(T.DEPARTMENT_ID), getContext().getConnection());
         return rec;
     }
 
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleContext.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleContext.java
index e328ec0..cedb519 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleContext.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleContext.java
@@ -3,46 +3,27 @@
  */
 package org.apache.empire.jsf2.websample.web;
 
-import java.sql.Connection;
-
-import javax.faces.context.FacesContext;
-
-import org.apache.empire.db.DBDatabaseDriver;
-import org.apache.empire.db.context.DBContextBase;
+import org.apache.empire.jsf2.app.WebDBContext;
 import org.apache.empire.jsf2.websample.db.SampleDB;
 
-public class SampleContext extends DBContextBase
+/**
+ * This is an example for a custom DBContext extension
+ * @author rainer
+ *
+ */
+public class SampleContext extends WebDBContext<SampleDB>
 {
-    private final SampleApplication app;
-    
-    private final SampleDB db;
-    
-    public SampleContext(SampleApplication app)
-    {
-        this.app = app;
-        this.db = app.getDatabase(); 
-    }
+    private final SampleSession session;
     
-    public SampleDB getDatabase()
+    public SampleContext(SampleApplication app, SampleSession session)
     {
-        return db;
+        super(app, app.getDatabase());
+        // the session
+        this.session = session;
     }
 
     public SampleUser getUser()
     {
-        return SampleUtils.getSampleUser();
-    }
-    
-    @Override
-    public DBDatabaseDriver getDriver()
-    {
-        return getDatabase().getDriver();
-    }
-
-    @Override
-    public Connection getConnection()
-    {
-        FacesContext fc = FacesContext.getCurrentInstance();
-        return app.getConnectionForRequest(fc, db);
+        return session.getUser();
     }
 }
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleUtils.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleUtils.java
index 70c352a..5391871 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleUtils.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleUtils.java
@@ -18,8 +18,6 @@
  */
 package org.apache.empire.jsf2.websample.web;
 
-import java.sql.Connection;
-
 import javax.faces.context.FacesContext;
 
 import org.apache.empire.jsf2.app.FacesUtils;
@@ -96,26 +94,6 @@ public class SampleUtils extends FacesUtils
         return getFilePath(fc, path, file);
     }
 
-    /* Connection */
-
-    public static Connection getConnection()
-    {
-        FacesContext fc = getContext();
-        return getWebApplication().getConnectionForRequest(fc, getDatabase());
-    }
-
-    public static void releaseConnection(boolean commit)
-    {
-        FacesContext fc = getContext();
-        getWebApplication().releaseConnection(fc, getDatabase(), commit);
-    }
-
-    public static void releaseConnection()
-    {
-        FacesContext fc = getContext();
-        getWebApplication().releaseConnection(fc, getDatabase());
-    }
-
     /* Messages */
 
     public static String getMessage(String messageKey)
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/SamplePage.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/SamplePage.java
index 84eefca..5d3a5b4 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/SamplePage.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/SamplePage.java
@@ -25,6 +25,7 @@ import org.apache.empire.jsf2.pages.Page;
 import org.apache.empire.jsf2.websample.db.SampleDB;
 import org.apache.empire.jsf2.websample.web.SampleApplication;
 import org.apache.empire.jsf2.websample.web.SampleContext;
+import org.apache.empire.jsf2.websample.web.SampleSession;
 import org.apache.empire.jsf2.websample.web.SampleUser;
 import org.apache.empire.jsf2.websample.web.SampleUtils;
 
@@ -34,12 +35,13 @@ public class SamplePage extends Page
 
     private SampleContext sampleContext = null;
 
-    public SampleContext getSampleContext()
+    public synchronized SampleContext getSampleContext()
     {
         if (this.sampleContext == null)
         {
             SampleApplication app = SampleUtils.getSampleApplication();
-            this.sampleContext = new SampleContext(app);
+            SampleSession session = SampleUtils.getSampleSession();
+            this.sampleContext = new SampleContext(app, session);
         }
         return this.sampleContext;
     }
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java
new file mode 100644
index 0000000..e4c4394
--- /dev/null
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java
@@ -0,0 +1,75 @@
+package org.apache.empire.jsf2.app;
+
+import java.sql.Connection;
+
+import javax.faces.context.FacesContext;
+
+import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBDatabaseDriver;
+import org.apache.empire.db.context.DBContextBase;
+import org.apache.empire.exceptions.NotSupportedException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This is the basic implementation of a DBContext for a web application
+ * Important: The connection is obtained on HttpRequest scope and hot held by the context
+ * The connection is automatically released via the FacesRequestPhaseListener
+ * @author rainer
+ *
+ * @param <DB>
+ */
+public class WebDBContext<DB extends DBDatabase> extends DBContextBase
+{
+    private static final Logger  log  = LoggerFactory.getLogger(WebDBContext.class);
+
+    private final WebApplication app;
+    private final DB             database;
+
+    public WebDBContext(WebApplication app, DB db)
+    {
+        this.app = app;
+        this.database = db;
+        // check driver
+        if (db.getDriver() == null)
+            log.warn("Database {} has no driver attached.", db.getClass().getSimpleName());
+    }
+
+    public DB getDatabase()
+    {
+        return database;
+    }
+
+    @Override
+    public DBDatabaseDriver getDriver()
+    {
+        return database.getDriver();
+    }
+
+    /**
+     * gets a Connection for the current request
+     * IMPORTANT: Do not hold the connection!
+     */
+    @Override
+    public Connection getConnection()
+    {
+        FacesContext fc = FacesContext.getCurrentInstance();
+        return this.app.getConnectionForRequest(fc, database);
+    }
+
+    /**
+     * Unclear weather this is any useful
+     * Do not call, as the connections are managed by the Application
+     */
+    @Override
+    public void discard()
+    {
+        /*
+        FacesContext fc = FacesContext.getCurrentInstance();
+        this.app.releaseConnection(fc, database);
+        // discard
+        super.discard();
+        */
+        throw new NotSupportedException(this, "discard");
+    }
+}
diff --git a/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java b/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
index f7a0a81..59933ff 100644
--- a/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
@@ -96,19 +96,21 @@ public abstract class DBContextBase implements DBContext
     @Override
     public synchronized void removeRollbackHandler(DBObject object)
     {
-        if (rollbackHandler!=null && rollbackHandler.containsKey(object))
-            log.info("test");
-        
         if (object==null)
             rollbackHandler=null;   // remove all
         else if (rollbackHandler!=null && rollbackHandler.remove(object)!=null)
             log.info("Rollback handler for object {} was removed", object.getClass().getSimpleName());
     }
 
+    /**
+     * Discard connection releated ressources
+     * WARING: No gurarantee it will be called
+     */
     @Override
     public void discard()
     {
         /* don't close connection! */
+        rollbackHandler=null;
     }
     
     /**
diff --git a/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java b/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
index 8f23b8d..1afbe4e 100644
--- a/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
+++ b/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
@@ -4,10 +4,8 @@
 package org.apache.empire.db.context;
 
 import java.sql.Connection;
-import java.sql.SQLException;
 
 import org.apache.empire.db.DBDatabaseDriver;
-import org.apache.empire.db.exceptions.EmpireSQLException;
 
 public class DBContextStatic extends DBContextBase
 {