Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.sql.SQLException: database connection closed

I have a problem with the SQLite driver for Java (JDBC). When I want to load a database, it says that it was loaded, but instatly it was closed. I seperated my code in different files:

SQLite.java

package net.jeddsan;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;

public class SQLite {
    public static Connection createOrOpenDatabase(String database) {

        String url = "jdbc:sqlite:" + database;

        try (Connection conn = DriverManager.getConnection(url)) {
            if (conn != null) {
                System.out.println("A new database has been created.");
                conn.setAutoCommit(false);
                return conn;
            }else{
                return null;
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
            return null;
        }
    }
}

MainController.java

@Override
    public void initialize(URL url, ResourceBundle rb) {
        c = SQLite.createOrOpenDatabase("test.db");

        try {
            sta = c.createStatement();
            sta.executeQuery("INSERT INTO token (token) VALUES ('123')");
            sta.close();
        } catch (SQLException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            c.close();
        } catch (SQLException ex) {
            Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Log

SCHWERWIEGEND: null
java.sql.SQLException: database connection closed
    at org.sqlite.core.CoreConnection.checkOpen(CoreConnection.java:336)
    at org.sqlite.jdbc4.JDBC4Connection.createStatement(JDBC4Connection.java:38)
    at org.sqlite.jdbc3.JDBC3Connection.createStatement(JDBC3Connection.java:193)
    at net.jeddsan.MainController.initialize(MainController.java:103)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at net.jeddsan.koradesktop.start(koradesktop.java:22)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
like image 530
Julian Schmuckli Avatar asked Feb 27 '17 19:02

Julian Schmuckli


People also ask

How do you deal with closing connections in database pool?

SOLUTION. To resolve this issue, it is necessary to configure a datasource for JDBC that accepts a connection checking mechanism. Before being used, a connection is tested for its validity and not used if it has been closed already. An implementation of either c3p0 or Apache Commons DBCP is recommended.

What is Java SQL SQLException?

The SQLException class provides information on a database access error. Each SQLException provides several kinds of information: a string describing the error. This is used as the Java Exception message, and is available via the getMesage() method. A "SQLstate" string which follows the XOPEN SQLstate conventions.

What is closed Connection in Oracle?

The most likely cause is a firewall between you and the database that is killing connections after a certain amount of idle time. The most common fix is to make your connection pool run a validation query when a connection is checked out from it.


1 Answers

This try-with-resources construct will invoke method close on Connection when you leave its scope:

try (Connection conn = DriverManager.getConnection(url)) {
    return conn;
}

So, you effectively return closed connection.

Change it to regular try construct to return live connection:

try {
    Connection conn = DriverManager.getConnection(url);
    return conn;
} catch (SQLException e) {
    return null;
}
like image 155
hoaz Avatar answered Oct 16 '22 22:10

hoaz