Java7 sqljdbc4 - SQL error 08S01 on getConnection()
Asked Answered
S

2

9

I'm trying to write a really simple GUI app for inserting some records into a database, and reading back some records (nothing fancy, just 1 table with 3 rows, no relations). The source...

package EntryProg;
import java.sql.*;
import com.microsoft.sqlserver.jdbc.*;



public class CourseDataEntryHandler
{
    private Connection connect;
    private CallableStatement callState;
    private ResultSet rSet;
    private SQLServerDataSource dSource;

    public CourseDataEntryHandler()
    {
        rSet = null;
        callState = null;

        dSource = new SQLServerDataSource();
        dSource.setUser(REDACTED);
        dSource.setPassword(REDACTED);
        dSource.setServerName(REDACTED);
        dSource.setPortNumber(REDACTED);
        dSource.setDatabaseName(REDACTED);
        dSource.setEncrypt(true);
        dSource.setTrustServerCertificate(true);
        try
        {

Error here

            connect = dSource.getConnection();

end error

        }
        catch (SQLServerException e)
        {
            //TODO Figure out how to handle -- logging for now, console
            do
            {
                System.out.println(e.getErrorCode());
                System.out.println(e.getMessage());
                System.out.println(e.getSQLState());
                e = (SQLServerException) e.getNextException();
            } while (e != null);
            System.out.println("END");
            System.out.println();
        }
    }

I get the following error...

(code)0

(message)SQL Server did not return a response. The connection has been closed.

(state)08S01

I've verified that the user,pass,server name,port, and DB name are all accurate. If I change the username to a non-valid one, I get a "could not log in" error reported back so I know I'm hitting the server.

I've not been able to fully connect once, so I know it's not a "too many connections" issue, as the only person currently logged into the server is me via sql management studio. It doesn't work when I log out of that either so definitely not a connections # issue.

The applications user has datareader/datawriter permissions as well. (I'm using Eclipse, if that matters. And am referencing the sqljdbc4.jar library).

I'm at a loss as to where to go with troubleshooting this. Any help would be greatly appreciated.

EDIT Update - I've also tried a connection string and using DriverManager.getConnection(connString) to set the connection, that didn't work either. The result is the same. Also, SQL server 2008 r2 is the sql server version I'm using.

EDIT I wrote a quick C# program to test the connection, sure enough the connection works fine in .net, unfortunately I have to use java for this project (it's a project I've chosen to do on my own for a class, only requirement is it be in Java...teacher has no clue what's going on either).

Snell answered 24/1, 2012 at 14:57 Comment(1)
Looks like I might have to put a bounty out on this one >.<Snell
D
15

Comment the line with setEncrypt(true):

...
dSource.setDatabaseName(REDACTED);
//dSource.setEncrypt(true);
dSource.setTrustServerCertificate(true);
...

You might have trouble with the encryption setting. From the setEncrypt(...) documentation:

If the encrypt property is set to true, the Microsoft SQL Server JDBC Driver uses the JVM's default JSSE security provider to negotiate SSL encryption with SQL Server. The default security provider may not support all of the features required to negotiate SSL encryption successfully. For example, the default security provider may not support the size of the RSA public key used in the SQL Server SSL certificate. In this case, the default security provider might raise an error that will cause the JDBC driver to terminate the connection. In order to resolve this issue, do one of the following:

  • Configure the SQL Server with a server certificate that has a smaller RSA public key

  • Configure the JVM to use a different JSSE security provider in the "/lib/security/java.security" security properties file

  • Use a different JVM

Update

With Java versions 1.6.0_29 and 7.0.0_1 Oracle introduced a security fix for the SSL/TLS BEAST attack that very likely will cause the very same problem. The above security fix is known to make trouble for database connections to MSSQL Server with both the jTDS driver and the Microsoft driver. You can either

  • decide not to use encryption by not using setEncrypt(true) (as specified above)
  • or, if it is enforced by MSSQL Server, you could turn off the Java fix in your JVM by setting the -Djsse.enableCBCProtection=false system property. Be warned, it will affect all SSL connections within the same VM.
Dismember answered 25/1, 2012 at 11:14 Comment(5)
Can't comment it out, for security reasons the SQL server instance I'm connecting to forces ssl. The cert is a startcom freebie, so the RSA size shouldn't be an issue. I've even went through the trouble of not using trustservercert and importing the required certs for use in Java (about 3 hours of troubleshooting there) with no luck. I ended up getting the same 08s01 error.Snell
Then you should try turning off the Oracle fix for the SSL/TLS BEAST attack in your JVM by using the -Djsse.enableCBCProtection=false system property. Be warned, it will affect all SSL connections within the VM. The fix was added since version 1.6.0_29 and 7.0.0_1.Dismember
Addendum: The above security fix is known to make trouble for database connections to MSSQL Server. See for example the jTDS bug #3468079 (sourceforge.net/tracker/…) that also mentions the Microsoft Driver.Dismember
Thanks, I'll try this out. Post back in a few with if it workedSnell
Well, it looks (at least at first glance) like this worked. It's not longer just dropping the connection. Of course now a call to a stored procedure to get all rows in a table isn't returning a result set, but that's a whole new thing to debug. Thanks much.Snell
F
0

Sometimes, the engine configuration is modified in such a way it doesn't accept external connections. After some research, the following worked for me:

  1. Open SQL Server Configuration Manager
  2. Get to SQL SERVER Network Configuration
  3. MSSQLSERVER Protocols (Double click)
  4. View TCP/IP (must be enabled) (Open)
  5. Go to tab "IP Addresses"
  6. Type into "TCP Port" :1433
  7. The enabled and activated options must be Enabled: Yes
  8. Restart the service
Freddyfredek answered 4/4, 2013 at 20:20 Comment(2)
It make sense to answer in the same language as question.Handwork
@ChristianSolano Welcome to Stack Overflow! Thanks for your first answer. However, take into account that English is the main language of the site, and your contributions will indeed be more helpful to other users if written in this language. Please, take a look at Is English required on Stack Overflow?.Petronilapetronilla

© 2022 - 2024 — McMap. All rights reserved.