Thread: No automatic reconnect after network error

No automatic reconnect after network error

From
"Markus Riehl"
Date:
Hi all,

JDBC Version: 8.1-405 (Type 3)
Postgre SQL Version: 8.1.3
OS: Windows XP

I have the PSQL database running on one server, my java application on
another server. The java application is a server application that opens a
database connection once at startup time.

The server application uses PreparedStatements (threshold=0) that are also
created at startup time.

After a network error (to test I removed the network cable from the server
where my java application is running for a few seconds), I get the following
error message when using on of the PreparedStatements:

org.postgresql.util.PSQLException: An I/O error occured while sending to the
backend.
        at
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:214)
        at
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.j
ava:437)
        at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2St
atement.java:353)
        at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statem
ent.java:257)
...

Using MySQL or SAPDB, the JDBC driver is automatically reconnecting to the
database when the connection is up again. Is there a way to use the PSQL
driver the same way?

How is this problem handled within Connection Pools (used within a servlet
environment)? Is the pool deleting "dead" connections automatically and is
creating new ones?

Thanks in advance

Markus



Re: No automatic reconnect after network error

From
Markus Schaber
Date:
Hi, Markus,

Markus Riehl wrote:

> Using MySQL or SAPDB, the JDBC driver is automatically reconnecting to the
> database when the connection is up again. Is there a way to use the PSQL
> driver the same way?

Currently, the backend cannot keep the current transaction if the
connection breaks, so it will be rolled back.

> How is this problem handled within Connection Pools (used within a servlet
> environment)? Is the pool deleting "dead" connections automatically and is
> creating new ones?

At least JBoss, you can use the following approach: In the Datasource
definition, put the following:

<datasources>
  <no-tx-datasource>
    <jndi-name>boo</jndi-name>
   <connection-url>jdbc:postgresql://localhost:5432/bar</connection-url>
    [ ... other attributes ... ]
    <new-connection-sql>SELECT version()</new-connection-sql>
    <check-valid-connection-sql>SELECT
version()</check-valid-connection-sql>
  </no-tx-datasource>
</datasources>

This validates the connection before it is handed out on the
application, and throws away invalid connections. Be aware that the SQL
is case sensitive, we had a problem with earlier versions of OpenMDX/CRX
that had upper case letters in the tags so they were ignored by jboss.

HTH,
Markus
--
Markus Schaber | Logical Tracking&Tracing International AG
Dipl. Inf.     | Software Development GIS

Fight against software patents in EU! www.ffii.org www.nosoftwarepatents.org

Re: No automatic reconnect after network error

From
"Markus Riehl"
Date:
Hi Markus,

thanks for your answer.

> Currently, the backend cannot keep the current transaction if the
> connection breaks, so it will be rolled back.

That's ok, I just want the JDBC driver to reconnect as soon as the
connection is available again.

> At least JBoss, you can use the following approach: In the Datasource
> definition, put the following:
>
> <datasources>
>   <no-tx-datasource>
>     <jndi-name>boo</jndi-name>
>    <connection-url>jdbc:postgresql://localhost:5432/bar</connection-url>
>     [ ... other attributes ... ]
>     <new-connection-sql>SELECT version()</new-connection-sql>
>     <check-valid-connection-sql>SELECT
> version()</check-valid-connection-sql>
>   </no-tx-datasource>
> </datasources>
>
> This validates the connection before it is handed out on the
> application, and throws away invalid connections. Be aware that the SQL
> is case sensitive, we had a problem with earlier versions of OpenMDX/CRX
> that had upper case letters in the tags so they were ignored by jboss.

I'm using Resin, not JBoss. The above configuration means a lot of overhead,
just to verify that a connection is still valid. Is this the recommended way
in a production environment?

I think this means that the PostgreSQL JDBC driver doesn't support automatic
reconnection. And I don't see this feature on the Roadmap. Is it unusual to
use PostgreSQL in a multi server environment?

Without this feature I don't think PostgreSQL is the right choice for me and
I keep using SAPDB. I could implement it in my server application, but
within the servlet engine it is almost impossible to do outside the JDBC
driver.

Thanks,

Markus


Re: No automatic reconnect after network error

From
"Guy Rouillier"
Date:
Markus Riehl wrote:
> Hi Markus,
>
> thanks for your answer.
>
>> Currently, the backend cannot keep the current transaction if the
>> connection breaks, so it will be rolled back.
>
> That's ok, I just want the JDBC driver to reconnect as soon as the
> connection is available again.
>
>> At least JBoss, you can use the following approach: In the Datasource
>> definition, put the following:
>>
>> <datasources>
>>   <no-tx-datasource>
>>     <jndi-name>boo</jndi-name>
>>
>>
>>
>>
>> <connection-url>jdbc:postgresql://localhost:5432/bar</connection-url>
>>   [ ... other attributes ... ] <new-connection-sql>SELECT
>> version()</new-connection-sql> <check-valid-connection-sql>SELECT
>> version()</check-valid-connection-sql> </no-tx-datasource>
>> </datasources>
>>
>> This validates the connection before it is handed out on the
>> application, and throws away invalid connections. Be aware that the
>> SQL is case sensitive, we had a problem with earlier versions of
>> OpenMDX/CRX that had upper case letters in the tags so they were
>> ignored by jboss.
>
> I'm using Resin, not JBoss. The above configuration means a lot of
> overhead, just to verify that a connection is still valid. Is this
> the recommended way in a production environment?
>
> I think this means that the PostgreSQL JDBC driver doesn't support
> automatic reconnection. And I don't see this feature on the Roadmap.
> Is it unusual to use PostgreSQL in a multi server environment?

Most JDBC drivers that I'm aware of don't do automatic reconnections.
We primarily use Oracle at work (sigh - I'm trying to change that -
long, slow effort) and it does not automatically reconnect.

I don't use Resin, but I just checked the Resin site here
http://www.caucho.com/resin-3.0/db/config.xtp#DataSource and it has the
same kind of connection validation that JBoss does.  See the section
titled "Reliability Configuration."  With that, Resin's DBPool will get
you a valid connection when they become available again.

>
> Without this feature I don't think PostgreSQL is the right choice for
> me and I keep using SAPDB. I could implement it in my server
> application, but within the servlet engine it is almost impossible to
> do outside the JDBC driver.

That does not appear to be the case.

--
Guy Rouillier


Re: No automatic reconnect after network error

From
Oliver Jowett
Date:
Markus Riehl wrote:

> I think this means that the PostgreSQL JDBC driver doesn't support automatic
> reconnection. And I don't see this feature on the Roadmap. Is it unusual to
> use PostgreSQL in a multi server environment?

It's unusual to have JDBC drivers automatically reconnect. I could see
an argument for it if you could guarantee that the reconnection was
invisible to the user .. but that's not the case here.

The JDBC spec's Connection lifecycle seems to be aimed at a 1:1 mapping
to real physical connections, anyway. Once it's closed for whatever
reason, a Connection stays closed. If you want to do more work, you need
to get a new Connection.

-O