Postgres driver bug - Mailing list pgsql-jdbc
From | Nikos Viorres |
---|---|
Subject | Postgres driver bug |
Date | |
Msg-id | CAHSf1Y2xfcEk8zAyBaQ8Ma7z-=ZEEheMX7TLgR5+jX7VJq6CJQ@mail.gmail.com Whole thread Raw |
Responses |
Re: Postgres driver bug
|
List | pgsql-jdbc |
Hi,
The attached simple piece of code results always in a the driver going into a wait state that never receives a wake up signal and by looking at the code, even if it does it will loop again into the same wait state. If anyone else thinks this is a problem i could provide a fix
regards
package nvrs.test;
import org.postgresql.PGConnection;
import org.postgresql.copy.PGCopyInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* Date: 5/2/2015
*/
public class PostgresDriverBug {
public static void main(String...args) throws SQLException {
PostgresConnectionFactory connectionFactory
= new PostgresConnectionFactory("localhost", 5432, "postgres",
"postgres", "postgres");
Connection con = connectionFactory.getNewConnection();
try (InputStream is = getPostgresInputStream("select * from public.some_table", con);
OutputStream os = getOutputStream()) {
final byte[] buffer = new byte[1024 * 4];
int read = is.read(buffer);
while (read > 0) {
os.write(buffer, 0, read);
read = is.read(buffer);
}
} catch (IOException e) {
System.err.println("Something bad happened " + e.getMessage());
con.rollback();
}
System.out.println("Done!");
}
private static OutputStream getOutputStream() throws IOException {
throw new FileNotFoundException("ooops");
}
private static InputStream getPostgresInputStream(String selectQuery, Connection con)
throws SQLException {
return new PGCopyInputStream(PGConnection.class.cast(con),
"COPY (" + selectQuery +") TO STDOUT");
}
public static class PostgresConnectionFactory {
private final String host;
private final int port;
private final String database;
private final String user;
private final String password;
public PostgresConnectionFactory(final String host, final int port, final String database,
final String user, final String password) {
this.host = host;
this.port = port;
this.database = database;
this.user = user;
this.password = password;
}
private String getConnectionUrl() {
return "jdbc:postgresql://" + host + ":" + port + "/" + database;
}
public Connection getNewConnection() throws SQLException {
Connection con = DriverManager.getConnection(getConnectionUrl(),
user,
password);
con.setAutoCommit(false);
return con;
}
}
}
The attached simple piece of code results always in a the driver going into a wait state that never receives a wake up signal and by looking at the code, even if it does it will loop again into the same wait state. If anyone else thinks this is a problem i could provide a fix
regards
package nvrs.test;
import org.postgresql.PGConnection;
import org.postgresql.copy.PGCopyInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* Date: 5/2/2015
*/
public class PostgresDriverBug {
public static void main(String...args) throws SQLException {
PostgresConnectionFactory connectionFactory
= new PostgresConnectionFactory("localhost", 5432, "postgres",
"postgres", "postgres");
Connection con = connectionFactory.getNewConnection();
try (InputStream is = getPostgresInputStream("select * from public.some_table", con);
OutputStream os = getOutputStream()) {
final byte[] buffer = new byte[1024 * 4];
int read = is.read(buffer);
while (read > 0) {
os.write(buffer, 0, read);
read = is.read(buffer);
}
} catch (IOException e) {
System.err.println("Something bad happened " + e.getMessage());
con.rollback();
}
System.out.println("Done!");
}
private static OutputStream getOutputStream() throws IOException {
throw new FileNotFoundException("ooops");
}
private static InputStream getPostgresInputStream(String selectQuery, Connection con)
throws SQLException {
return new PGCopyInputStream(PGConnection.class.cast(con),
"COPY (" + selectQuery +") TO STDOUT");
}
public static class PostgresConnectionFactory {
private final String host;
private final int port;
private final String database;
private final String user;
private final String password;
public PostgresConnectionFactory(final String host, final int port, final String database,
final String user, final String password) {
this.host = host;
this.port = port;
this.database = database;
this.user = user;
this.password = password;
}
private String getConnectionUrl() {
return "jdbc:postgresql://" + host + ":" + port + "/" + database;
}
public Connection getNewConnection() throws SQLException {
Connection con = DriverManager.getConnection(getConnectionUrl(),
user,
password);
con.setAutoCommit(false);
return con;
}
}
}
pgsql-jdbc by date: