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)
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.
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.
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.
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With