HSQLDB HSQLDB 2.5.0 - Wie Loggen abstellen?

inflamer

Bekanntes Mitglied
Hallo Forum,

die HSQLDB-Datenbank nutze ich "nur" als Dependance von UCanAccess. Nun ist es leider so, dass das Ding trotz Versuche dies zu unterbinden, unbeirrt in den StdErr loggt, und zwar keine Fehler, sondern eher so etwas:

Code:
Oct 07, 2022 2:24:55 AM org.hsqldb.persist.Logger logInfoEvent
INFO: Checkpoint start
Oct 07, 2022 2:24:55 AM org.hsqldb.persist.Logger logInfoEvent
INFO: checkpointClose start
Oct 07, 2022 2:24:55 AM org.hsqldb.persist.Logger logInfoEvent
INFO: checkpointClose synched
Oct 07, 2022 2:24:55 AM org.hsqldb.persist.Logger logInfoEvent
INFO: checkpointClose script done

usw.

Die Version von HSQLDB ist die 2.5.0. Habe schon reichlich gegoogelt, wie sich das Loggen denn abstellen ließe, aber nichts gefunden, was funktioniert. (Es werden im Großen und Ganzen die unterschiedlichsten System-Props vorgeschlagen, die bei mir jedoch, wie gesagt, nicht zum gewünschten Resultat führen.)

Weiß hier jemand Abhilfe? Vielen Dank!
 
Du kannst eine Datei: hsqldblog.properties anlegen
Code:
org.hsqldb.persist=WARNING
und dein Java-Programm mit dem VM-Parameter: -Djava.util.logging.config.file=hsqldblog.properties starten.
Das ist aber unbequem und fehleranfällig, so kann man die Datei auch direkt im Code als Ressource laden.
Java:
package playground;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.LogManager;

public class Main {

    public static void getCustomers() {
        final String db = "jdbc:hsqldb:file:sampledb;silent=true";
        final String user = "SA";
        final String password = "";
        try (
                Connection connection = DriverManager.getConnection(db, user, password);
                Statement stmt = connection.createStatement();
                ResultSet rs = stmt.executeQuery("select FIRSTNAME, LASTNAME from CUSTOMER");
        ) {
            while (rs.next()) {
                System.out.println("Customer Name: " + rs.getString("FIRSTNAME") + " " + rs.getString("LASTNAME"));
            }
        } catch (final SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(final String[] args) throws IOException {
        // before database access ...
        System.setProperty("hsqldb.reconfig_logging", "false");
        final LogManager manager = LogManager.getLogManager();
        manager.readConfiguration(Main.class.getResourceAsStream("hsqldblog.properties"));
        // ...
        getCustomers();
    }
}
pom.xml:
XML:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>playground</groupId>
  <artifactId>playground</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>17</release>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
      <dependency>
          <groupId>org.hsqldb</groupId>
          <artifactId>hsqldb</artifactId>
          <version>2.5.0</version>
      </dependency>
  </dependencies>
</project>
 
Danke für Deine ausführliche Antwort!

Habe mal den Code noch ein wenig weiter angepasst, damit auch die Notwendigkeit einer *.properties-Datei entfällt. Blöderweise funktioniert es so nicht. Wahrscheinlich würde es das unter normalen Umstanden, so mein Verdacht, aber UCanAccess stülpt da wohl nachträglich nochmal seine eigenen Settings drüber. (UCanAccess ist im Prinzip ein JDBC-Treiber für MS Access und nutzt HSQLDB lediglich als Werkzeug zum Zwischenpuffern, jedenfalls nach meinem Verständnis...)

Das bringt mich aber schon mal ein wenig weiter... Ich werde mir wohl mal genauer den UCanAccess-Code ansehen müssen...

Java:
  // before database access ...
  static {
    System.setProperty("hsqldb.reconfig_logging", "false");

    LogManager manager = LogManager.getLogManager();
    try {
      byte[] configFileAsByteArray = "org.hsqldb.persist=WARNING".getBytes();
      manager.readConfiguration(new ByteArrayInputStream(configFileAsByteArray));
    } catch (Exception e) {
      e.printStackTrace(); // wurde bei mir nicht geworfen
    }
  }
 
Zuletzt bearbeitet:
Man könnte in der *.properties-Datei auch noch ein LogFile definieren, damit die restlichen Log-Meldungen nicht verloren gehen.
 

Zurück
Oben