[Schmitzm-commits] r1746 - trunk/schmitzm-core/src/main/java/de/schmitzm/postgres

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Mon Oct 3 11:59:01 CEST 2011


Author: alfonx
Date: 2011-10-03 11:59:00 +0200 (Mon, 03 Oct 2011)
New Revision: 1746

Modified:
   trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java
Log:


Modified: trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java
===================================================================
--- trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java	2011-10-02 13:26:29 UTC (rev 1745)
+++ trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java	2011-10-03 09:59:00 UTC (rev 1746)
@@ -10,17 +10,20 @@
 
 import org.apache.log4j.Logger;
 
+import com.sun.tools.javac.util.Pair;
+
 import de.schmitzm.lang.LangUtil;
 
 /**
- * Hilfsmethoden für PostgreSQL. Die Dependency soll nur {@link Connection} sein. In Hibernate kann über #doWork eine
- * {@link Connection} erhalten werden.
+ * Hilfsmethoden für PostgreSQL. Die Dependency soll nur {@link Connection}
+ * sein. In Hibernate kann über #doWork eine {@link Connection} erhalten werden.
  */
 public class PGUtil {
 	static final Logger log = Logger.getLogger(PGUtil.class);
 
 	/**
-	 * PostgreSQL Privilegien die per Grant einer Tabelle zugeordnet werden können.<br/>
+	 * PostgreSQL Privilegien die per Grant einer Tabelle zugeordnet werden
+	 * können.<br/>
 	 * 
 	 * @see http://www.postgresql.org/docs/9.1/static/sql-grant.html
 	 */
@@ -97,8 +100,8 @@
 	}
 
 	/**
-	 * Querys the <code>geometry_columns</code> table is part of every POSTGIS installation and must/should describe the
-	 * geometry columns and tables.
+	 * Querys the <code>geometry_columns</code> table is part of every POSTGIS
+	 * installation and must/should describe the geometry columns and tables.
 	 */
 	static public String[] getColumnsDescribedInGeometryColumnsTable(Statement s) {
 		String[] columns = new String[0];
@@ -140,8 +143,8 @@
 	/**
 	 * @param binding
 	 *            Eine "einfache" Javaklasse, die in PG abgebildet werden soll.
-	 * @return einen PG-spezifischen Datentypenamen für einen Javatyp zurück, z.b. "double precision" für
-	 *         <code>Double.class</code>
+	 * @return einen PG-spezifischen Datentypenamen für einen Javatyp zurück,
+	 *         z.b. "double precision" für <code>Double.class</code>
 	 */
 	public static String getColTypeName(Class<?> binding) {
 
@@ -172,7 +175,8 @@
 	}
 
 	/**
-	 * Liefert <code>true</code> wenn ein Schema mit dem Namen in der PG Datenbank existiert.
+	 * Liefert <code>true</code> wenn ein Schema mit dem Namen in der PG
+	 * Datenbank existiert.
 	 */
 	public static boolean existsSchema(Connection c, String schemaname) throws SQLException {
 		String sql = "select 1 from pg_catalog.pg_namespace where nspname = '" + schemaname.toLowerCase() + "'";
@@ -186,7 +190,8 @@
 	}
 
 	/**
-	 * Liefert eine Liste der Rollen in denen der Übergebenen USER (Login role) ist. <br/>
+	 * Liefert eine Liste der Rollen in denen der Übergebenen USER (Login role)
+	 * ist. <br/>
 	 * Tested with PG 8.4
 	 */
 	public static List<String> listRolesForUser(Connection c, String username) throws SQLException {
@@ -223,8 +228,8 @@
 	}
 
 	/**
-	 * Liste aller Tabellennamen in diesem Schema, ohne die Schemaangabe im Namen. (Also 'anreden' und nicht
-	 * 'public.anreden') <br/>
+	 * Liste aller Tabellennamen in diesem Schema, ohne die Schemaangabe im
+	 * Namen. (Also 'anreden' und nicht 'public.anreden') <br/>
 	 * Tested with PG 8.4
 	 * 
 	 * @param schemaname
@@ -302,7 +307,9 @@
 	 * @param name
 	 *            z.B.: keckformel wird dann zu keckformel()
 	 * @param plCommands
-	 *            z.B. NEW.kpk_kreis = NEW.risiko_soz+NEW.risiko_emo+NEW.risiko_moti +NEW.risiko_spr+NEW.risiko_wohl;
+	 *            z.B. NEW.kpk_kreis =
+	 *            NEW.risiko_soz+NEW.risiko_emo+NEW.risiko_moti
+	 *            +NEW.risiko_spr+NEW.risiko_wohl;
 	 * @throws SQLException
 	 */
 	public static void createOrReplaceFunction(Connection c, String name, String plCommands) throws SQLException {
@@ -338,7 +345,8 @@
 	 * @param idxNamePostfix
 	 *            e.g. 'idx1'
 	 * @param unique
-	 *            <code>true</code> if the columns are unique. A UNIQUE INDEX will be created.
+	 *            <code>true</code> if the columns are unique. A UNIQUE INDEX
+	 *            will be created.
 	 */
 	public static void addIndex(Connection c, final String tableName, final String columns, String idxPostfix,
 			final boolean unique) throws SQLException {
@@ -346,10 +354,11 @@
 	}
 
 	/**
-	 * Liefert eine Liste aller Indexnamen die für eine Tabelle existieren. Der Tabellenname wird mit <code>like</code>
-	 * verglichen, darf also <code>%</code> enthalten.<br/>
-	 * Achtung: Diese abfrage ist nicht Schema-Spezifisch. Eine schema. Angabe vor dem tabellennamen wird automatisch
-	 * entfernt.
+	 * Liefert eine Liste aller Indexnamen die für eine Tabelle existieren. Der
+	 * Tabellenname wird mit <code>like</code> verglichen, darf also
+	 * <code>%</code> enthalten.<br/>
+	 * Achtung: Diese abfrage ist nicht Schema-Spezifisch. Eine schema. Angabe
+	 * vor dem tabellennamen wird automatisch entfernt.
 	 */
 	public static List<String> listIndexesForTable(Connection c, String tableName) throws SQLException {
 		Statement s = c.createStatement();
@@ -384,16 +393,21 @@
 	 * @param idxNamePostfix
 	 *            e.g. 'idx1'
 	 * @param unique
-	 *            <code>true</code> if the columns are unique. A UNIQUE INDEX will be created.
+	 *            <code>true</code> if the columns are unique. A UNIQUE INDEX
+	 *            will be created.
 	 * @param tablespace
-	 *            <code>null</code> oder der name des tablespace in dem der Index liegen soll.
+	 *            <code>null</code> oder der name des tablespace in dem der
+	 *            Index liegen soll.
 	 * @param type
-	 *            <code>null</code> für DB default oder "hash" oder "btree" oder "gin" etc...
+	 *            <code>null</code> für DB default oder "hash" oder "btree" oder
+	 *            "gin" etc...
 	 * @param forceRecreationIfExistsAlready
-	 *            wenn <code>true</code> dann werden der Index vorher gedroppt falls er exisitert.
+	 *            wenn <code>true</code> dann werden der Index vorher gedroppt
+	 *            falls er exisitert.
 	 * @param fillFactor
-	 *            Wert von >0. -> 1. Bei .5 wird für den Index doppelt so viel Platz reserviert wie aktuell benötig, um
-	 *            auf weiteres Wachstum der Tabelle ohne Indexfragmentierung reagieren zu können.
+	 *            Wert von >0. -> 1. Bei .5 wird für den Index doppelt so viel
+	 *            Platz reserviert wie aktuell benötig, um auf weiteres Wachstum
+	 *            der Tabelle ohne Indexfragmentierung reagieren zu können.
 	 */
 	public static void addIndex(Connection c, final String tableName, final String columns, String idxPostfix,
 			final boolean unique, String tablespace, String type, boolean forceRecreationIfExistsAlready,
@@ -485,8 +499,8 @@
 	}
 
 	/**
-	 * Fügt einen Benutzer zu einer Rolle hinzu. Wenn der benutzer bereits in der Rolle enthalten ist, wird keine
-	 * Exception geschmisssen.
+	 * Fügt einen Benutzer zu einer Rolle hinzu. Wenn der benutzer bereits in
+	 * der Rolle enthalten ist, wird keine Exception geschmisssen.
 	 * 
 	 * @throws SQLException
 	 */
@@ -495,8 +509,9 @@
 	}
 
 	/**
-	 * Der : (Doppelpunkt) hat in PSQL eine besondere Bedeutung. Er wind mit dieser methode escaped. Diese Methode
-	 * sollte mit <code>like E'"+PGUtil.escape(...)+"'</code> verwendet werden.
+	 * Der : (Doppelpunkt) hat in PSQL eine besondere Bedeutung. Er wind mit
+	 * dieser methode escaped. Diese Methode sollte mit
+	 * <code>like E'"+PGUtil.escape(...)+"'</code> verwendet werden.
 	 */
 	public static String escape(String key) {
 		key = key.replaceAll(":", "\\:");
@@ -509,9 +524,11 @@
 	 * @param c
 	 *            DB-Verbindung
 	 * @param dbName
-	 *            Name der Datenbank fuer die die Sessions gezaehlt werden (kann {@code null} sein)
+	 *            Name der Datenbank fuer die die Sessions gezaehlt werden (kann
+	 *            {@code null} sein)
 	 * @param userName
-	 *            Name des Users fuer den die Sessions gezaehlt werden (kann {@code null} sein)
+	 *            Name des Users fuer den die Sessions gezaehlt werden (kann
+	 *            {@code null} sein)
 	 */
 	public static int getOpenSessionCount(Connection c, String dbName, String userName) throws SQLException {
 		return getOpenSessionCount(c, dbName, userName, null);
@@ -523,11 +540,14 @@
 	 * @param c
 	 *            DB-Verbindung
 	 * @param dbName
-	 *            Name der Datenbank fuer die die Sessions gezaehlt werden (kann {@code null} sein)
+	 *            Name der Datenbank fuer die die Sessions gezaehlt werden (kann
+	 *            {@code null} sein)
 	 * @param userName
-	 *            Name des Users fuer den die Sessions gezaehlt werden (kann {@code null} sein)
+	 *            Name des Users fuer den die Sessions gezaehlt werden (kann
+	 *            {@code null} sein)
 	 * @param queryLike
-	 *            like-Beindung auf die Query die in der Session ausgeführt wird, oder <code>null</code>
+	 *            like-Beindung auf die Query die in der Session ausgeführt
+	 *            wird, oder <code>null</code>
 	 */
 	public static int getOpenSessionCount(Connection c, String dbName, String userName, String queryLike)
 			throws SQLException {
@@ -587,4 +607,48 @@
 		c.createStatement().executeUpdate(dropView);
 	}
 
+	/**
+	 * Liefert eine Liste der aktuell laufenden Queries und ihrere Laufzeiten
+	 * zurück. Der 2. Teil der Rückgabepaare ist ein String der einem PG
+	 * Interval entspricht. Dieses kann mit der Klasse PGInterval geparst
+	 * werden.<br/>
+	 * 
+	 * @param datName
+	 *            <code>null</code> oder der Datenbankname, auf den die Abfrage
+	 *            gefiltert werden soll.
+	 * 
+	 * @param minSecondsRunning
+	 *            <code>null</code> oder die zurückgegebenen Anfragen müssen
+	 *            mindestens soviele Sekunden schon laufen.
+	 */
+	static public List<Pair<String, String>> listQueries(Connection c, String datName, Integer minSecondsRunning)
+			throws SQLException {
+		ArrayList<Pair<String, String>> result = new ArrayList<Pair<String, String>>();
+
+		String where = "where current_query not like '%IDLE%' ";
+
+		if (datName != null)
+			where += " and datname like '" + datName + "'";
+
+		if (minSecondsRunning != null) {
+			if (minSecondsRunning < 0)
+				throw new IllegalStateException();
+
+			where += " and age (now(),query_start) >= interval '" + minSecondsRunning + " second' ";
+		}
+
+		final String sql = "select current_query, age (now(),query_start) as qage from pg_stat_activity " + where
+				+ " order by qage desc";
+		ResultSet rs = c.createStatement().executeQuery(sql);
+
+		while (rs.next()) {
+			String q = rs.getString(1);
+			String since = rs.getString(2);
+
+			result.add(new Pair<String, String>(q, since));
+		}
+
+		return result;
+	}
+
 }



More information about the Schmitzm-commits mailing list