connection timeout when connecting to a remote postgresql database - java

I am facing this problem: I have a program that loops the following:
connect to a postgresql database
print a count number
close the connection
code is as follow:
int i = 0;
while(true){
IConnection conn = ((ConnectionHelper)HelperFactory.getInstance().getHelper("ConnectionHelper")).getConnection("psql");
if(conn != null && conn.connect()){
conn.close();
System.out.println(i++);
}
}
I connect to psql db by jdbc, something like this:
DriverManager.getConnection("jdbc:postgresql://" + host + ":5432/" + database,
user, password);
the conn.connect() returns true if it can successfully connect to the database
(tested, I can retrieve data from it)
But i get the following result:
0
1
2
.
.
.
3919
3920
3921
3922
org.postgresql.util.PSQLException: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:136)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:393)
at org.postgresql.Driver.connect(Driver.java:267)
at the last loop the program stuck at trying to connect to psql til timeout. Any help?

Related to the exception message host or/and port where postgres is running not equals to the host or/and port what you put to the connect address, check it and you will find problem.
And yes, your server cannot be reachable, some firewals and so on, check it too.

Related

CommunicationsException: The last packet sent successfully to the server xxx milliseconds ago

I have a question about MySQL/JDBC connections in Java.
I wrote an application that successfully communicates with a database, but the issue that I recently found out was that my DB connection was dropping, and I need the application to have a connection to the DB at all times.
This is a small snipplet of the error I was getting:
com.mysql.cj.jdbc.exceptions.CommunicationsException: The last packet successfully received from the server was 89,225,584 milliseconds ago. The last packet sent successfully to the server was 89,225,584 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003)
This is also a snipplet of the constructor for my DBConnections class:
private final String url = "jdbc:mysql://localhost:3306/", database.....;
private Connection connection;
public DBConnector(){
try {
// Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url+database, username, password);
} catch (Exception ex) {
System.out.println("Error: " + ex);
}
}
In the errors section, I noticed it's telling me to add autoReconnect=true, I wondered; will my connection still stay up for longer if I structured the connection class like this:
connection = DriverManager.getConnection(url+database+"?autoReconnect=true", username, password);
If not, what else could I do to make sure my connection doesn't drop?
What I would suggest is to use a connection pool (Apache DBCP or HikariCP - the last one is currently having the best performance out of all solutions on the market) with configuration of testing connection before borrowing it from the pool. Depending on the library there should be an option like setTestOnBorrow(true).
In real applications you should always use connection pool instead of manually handling connections.

Java MySQL ?autoReconnect=true

I have this error:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
The last packet successfully received from the server was 54,607,614 milliseconds ago.
The last packet sent successfully to the server was 54,607,614 milliseconds ago. is longer than the server configured value of 'wait_timeout'.
You should consider either expiring and/or testing connection validity before use in your application,
increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
But I don't know what's the error in my Programm, I have autoReconnect=true... :
connection = DriverManager.getConnection(
"jdbc:mysql://" + host + ":" + port + "/" + database + "?autoReconnect=true&useSSL=false", username, password
);
This is warning message, that no sql commands have been send over specified period to the Mysql server. JDBC can do auto reconnect on such event.
Add also parameter
cmaxReconnets=5
to try to reconnect 5 times before give up.
Also there is parameter for initial timeout before retry
initialTimeout=1
You can add those to properties when obtaining connection.
DriverManager.getConnection(connectionString, properties)

Connection timeout over VPN

I have a Java program that connects to SQL Server with mssql-jdbc driver. But some users use this program over VPN and the last days we are having issues with that VPN that is causing slowness. When I ping the machine that have the SQL instance returns a 1800ms ping. Last week this ping was 400~600ms.
When the ping is above 800ms Java returns a timeout to me, so the users using VPN can not connect.
I have tried to set up a higher login timeout in Java connection string to 10 minutes for testing, but even with that the connection always return a timeout. This only happens when the ping is above 800ms so I do not think the problem can be ports, firewall or something like that.
//my connection code
DriverManager.setLoginTimeout(60); //setting up my timeout to 60 seconds
private static final String CONNSTRING = "jdbc:sqlserver://server-name\\SQLEXPRESS;databaseName=db_name;"; //my connection string
conn = DriverManager.getConnection(CONNSTRING, USER, PASS);
Maybe there is another property that I can add to my connection string to solve that problem? Or something that I can set up in SQL Server to allow this connection when the VPN is slow?
I appreciate the help.

Can't connect to SQL Server using JDBC

I'm having issues connecting to a Database server with the JDBC driver in Netbeans. I've tried everything, enabling TCP/IP, opening the ports, I've followed tutorials online. It just won't work.
This is the error message I get in the console:
Information: Error: The TCP / IP connection could not be made to the MANUEL-PC host, port 1433. Error: "Connection refused: connect Verify the connection properties, check that there is an instance of SQL Server running on the host and accepting TCP / IP connections on the port and verify that there is no firewall blocking TCP connections on the port. "
Start of the class we're using...
public class DBPosteo
{
private final String URL ="jdbc:sqlserver://MANUEL-PC\\SQLEXPRESS:1433;databaseName=DLC_MotorDeBusqueda;integratedSecurity=true";
private Connection con;
String query = "";
PreparedStatement pstmt;
ResultSet rs;
public void init()
throws ClassNotFoundException, SQLException
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(URL);
}
DB Server name in SQL Management Studio
Thanks in advance for the help... I've never struggled so much with Databases in my life :)
Remove the port number.
Only specify either instance name (SQLEXPRESS) or port number (1433), never both.
Since port 1433 is reserved for the unnamed instance, the SQLEXPRESS named instance would be on a different port, and unless you specifically configured it (unlikely), that port is dynamic and can change on reboots, so you need the named lookup.

java.net.ConnectException

I've seen few threads about this topic but I still can't figure out what's wrong. Following is the code:
import java.sql.*;
public class SQL
{
public static void main(String[] args)
{
Connection conn = null;
String url = "jdbc:mysql://mysql1.oyo.co.il:3306/";
String dbName = "sdarot2_winner";
String driver = "com.mysql.jdbc.Driver";
String userName = "";
String password = "";
String table = "LEADER_CAM_PRODUCTS";
try {
Class.forName(driver).newInstance();
conn = DriverManager.getConnection(url+dbName,userName,password);
System.out.println("Connected to the database");
conn.close();
System.out.println("Disconnected from database");
}catch (Exception e) {
System.out.println(e);
}
}
}
And here is the error I get:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying > > exception:
** BEGIN NESTED EXCEPTION **
java.net.ConnectException
MESSAGE: Connection timed out: connect
STACKTRACE:
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.(Unknown Source)
at java.net.Socket.(Unknown Source)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
at com.mysql.jdbc.MysqlIO.(MysqlIO.java:271)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2744)
at com.mysql.jdbc.Connection.(Connection.java:1553)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at SQL.main(SQL.java:17)
** END NESTED EXCEPTION **
Last packet sent to the server was 1 ms ago.
Here is few things I found around:
The I.P/domain or port is incorrect
The I.P/domain or port (i.e service) is down
The I.P/domain is taking longer than your default timeout to respond
You have a firewall that is blocking requests or responses on whatever port you are using
You have a firewall that is blocking requests to that particular host
Your internet access is down
a) it is correct.
b) it's not down since I got a website that is working right now with that database.
c) how can I check that?I don't think that it's the problem since as I said I got a running website on this database.
d) now way because the same reason I mentioned above.
e) samem as d
So what I'm doing wrong?how come a php code can work with sql but java gives me errors?
Thank you.
As an experiment, try connecting to port 3306 on mysql1.oyo.co.il using your system's telnet command. Or some other utility (for example nc or netcat) that opens a raw TCP/IP connection. Depending on your OS / distro, you may have to locate and install a suitable command to help you with this trouble-shooting. Observe what happens.
Re your diagnosis:
a) it is correct.
If you say so ...
b) it's not down since I got a website that is working right now with that database.
At best you have demonstrated that the host is working. The web service on port 80 and the MySQL service on port 3306 are different services. (And in fact, it is possible that mysql1.oyo.co.il is doing clever packet routing tricks so that traffic on different ports is being tranparently routed to different hosts or virtual hosts.)
c) how can I check that?
Try changing / increasing the timeout.
I don't think that it's the problem since as I said I got a running website on this database.
My guess it is not a timeout issue ... but as I said above, the fact you got a website says NOTHING about whether the MySQL service is running.
d) now way because the same reason I mentioned above.
You've only demonstrated that you can get to port 80 ... see above
e) samem as d
You've only demonstrated that you can get to port 80 ... see above
Based on the above, it is plausible that:
you have a local firewall problem,
the MySQL service on that port is not currently running,
networking routing on the service side are broken for traffic on that port,
the MySQL service has been permanently turned off, or
the service's firewall has been configured to not accept network connections from random (or specific) places, including yours.
The fact that you are seeing a timeout rather than a "connection refused" suggests that this is more likely to be a networking or firewalling issue than a problem with the MySQL service endpoint itself.
My guess is that "they" have withdrawn the service ... and that you are not supposed to use it anymore. (Providing a public MySQL database service strikes me as an odd thing to do ... as well as being problematic from a security and administration standpoint.)
'Connection timed out' indicates either:
a server-side firewall that is deliberately ignoring your connection request
a network topology problem such that IP packets aren't getting through
the server host itself is down.
Most likely it is the first.
Note that, contrary to other answers here, it doesn't indicate that the server program is down, or a local firewall problem at the client. The former would cause 'connection refused' and the latter would give you something along the lines of 'permission denied', depending on your platform.

Categories

Resources