Derzeit arbeite ich in Spring Boot mit Postgres JDBC-Treiber und ich habe eine Verbindung mit meiner Datenbank. Wenn ich jedoch das erste Mal versuche einzufügen, erhalte ich keine Fehler, aber auf der DB-Seite sehe ich keine Einfügung. Beim zweiten Versuch erhalte ich den folgenden Fehler:Postgres kein Fehler und keine Einfügung
Cannot get out of auto-commit mode with error: org.postgresql.util.PSQLException: This connection has been closed.
SQLException: org.postgresql.util.PSQLException: This connection has been closed.
Bei beiden Versuchen kann ich nicht einfügen. Mein Debugger sagt mir, dass ich folgendes geschickt haben:
preparedStatement: INSERT INTO event (StartTime, EndTime, Description, name, DisplayPicLoc, attendenceCount) VALUES ('2016-2-29 19:0:0.000000 -5:0:0','2016-3-1 19:0:0.000000 -5:0:0','b','b',NULL,0)
Das Datenbankschema I eingerichtet haben, ist dies:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE event (eventID UUID DEFAULT uuid_generate_v4() NOT NULL primary key,
StartTime timestamp NOT NULL,
EndTime timestamp NOT NULL,
Description varchar(1500),
name varchar(80) NOT NULL,
DisplayPicLoc varchar(80),
attendenceCount int);
wie Meine Java-Server-Side-Code aussieht:
@Controller
public class CalendarController {
@RequestMapping(value="/event", method=RequestMethod.POST)
public @ResponseBody
String uploadEvent(@RequestParam("title") String title,
@RequestParam("description") String description,
@RequestParam("start") Date start,
@RequestParam("end") Date end){
Timestamp startTime = null;
Timestamp endTime = null;
try{
startTime = new Timestamp(start.getTime());
endTime = new Timestamp(end.getTime());
}
catch(Exception e){
System.err.print("Date conversion error: " + e);
return "failure";
}
System.out.println("Event received with Title: " + title +
" Description: " + description +
" Start: " + startTime +
" End: " + endTime);
Savepoint savepoint = null;
Connection connection = DatabaseConnection.connection;
try{
connection.setAutoCommit(false);
}
catch(SQLException e){
System.err.println("Cannot get out of auto-commit mode with error: " + e);
}
if(connection==null){
new DatabaseConnection();
}
try{
savepoint = connection.setSavepoint();
String query = "INSERT INTO event " +
"(StartTime, EndTime, Description, name, DisplayPicLoc, attendenceCount) " +
"VALUES (?,?,?,?,?,?);";
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setTimestamp(1, startTime);
preparedStatement.setTimestamp(2, endTime);
preparedStatement.setString(3, description);
preparedStatement.setString(4, title);
preparedStatement.setString(5, null);
preparedStatement.setInt(6, 0);
System.out.println("preparedStatement: " + preparedStatement);
preparedStatement.executeUpdate();
//connection.close();
return "success";
}
catch(SQLException e){
System.err.println("SQLException: " + e);
if(connection!=null && savepoint!=null){
try{
connection.rollback(savepoint);
}
catch(SQLException error){
System.err.println("SQLException: " + error);
}
}
}
finally{
if(connection != null) {
try {
connection.close();
}
catch(SQLException e) {
System.err.println("SQLException: " + e);
}
}
}
return "failure";
}
}
Wo bin ich falsch gelaufen?
Es gibt keine 'commit() 'in Ihrem Code –
Könnten Sie uns einen Code der' DatabaseConnection' Klasse zeigen, vor allem wie 'DatabaseConnection.connection;' deklariert und initialisiert wird? Es sieht wie eine statische Variable aus, die zwischen verschiedenen Threads geteilt wird. Warum verwendest du keinen Verbindungspool? – krokodilko
@a_horse_with_no_name Wo sollte ich das commit() setzen? Ich habe online nachgesehen, aber ich bin mir nicht sicher, ob ich das verstehe. – Bob