Σύνδεση JDBC MS SQL Server 2005
- rapadder
- Gbyte level
- Posts: 1897
- Joined: Thu Jun 17, 2004 7:12 pm
- Academic status: Alumnus/a
- Gender: ♂
Σύνδεση JDBC MS SQL Server 2005
Έχω εγκαταστήσει τον Microsoft SQL Server 2005 και προσπαθώ να εγκαταστήσω μια σύνδεση την βάση. Έχω κατεβάσει τον πιο πρόσφατο driver και προσπαθώ να ορίσω το connection string, με βάση τις οδηγίες που υπάρχουν διαθέσιμες. Το λάθος που μου εμφανίζεται είναι:
SQLException: The TCP/IP connection to the host has failed. java.net.ConnectException: Connection refused: connect
SQLState: 08S01
VendorError: 0
Διάφορα ulr που έχω δοκιμάσει είναι:
String url = "jdbc:sqlserver://localhost";
String url = "jdbc:sqlserver://localhost:1433"
Καμιά ιδέα; Η εντύπωση που έχω είναι ότι το url string είναι σωστό, απλά ο SQL Server έχει κόλλημα. Έχω κάνει και Enable το TCP/IP Protocol από τον Server Configuration Manager.
Κώδικας:
String url = "jdbc:sqlserver://localhost:1433";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
}catch (Exception ex) { }
try
{
Connection conn = DriverManager.getConnection(url, "root", "password");
}catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
SQLException: The TCP/IP connection to the host has failed. java.net.ConnectException: Connection refused: connect
SQLState: 08S01
VendorError: 0
Διάφορα ulr που έχω δοκιμάσει είναι:
String url = "jdbc:sqlserver://localhost";
String url = "jdbc:sqlserver://localhost:1433"
Καμιά ιδέα; Η εντύπωση που έχω είναι ότι το url string είναι σωστό, απλά ο SQL Server έχει κόλλημα. Έχω κάνει και Enable το TCP/IP Protocol από τον Server Configuration Manager.
Κώδικας:
String url = "jdbc:sqlserver://localhost:1433";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
}catch (Exception ex) { }
try
{
Connection conn = DriverManager.getConnection(url, "root", "password");
}catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
... Γράφτε κώδικα όσο είναι καιρός ...
- tsilochr
- Wow! Terabyte level
- Posts: 3246
- Joined: Tue Mar 16, 2004 2:47 pm
- Academic status: PhD
- Gender: ♂
- Location: mm.aueb.gr
- Contact:
Re: Σύνδεση JDBC MS SQL Server 2005
με τη βοήθεια του netstat από κονσόλα ή του tcpview δες αν η θύρα του sql server είναι ανοιχτή και περιμένει αιτήσειςSQLException: The TCP/IP connection to the host has failed. java.net.ConnectException: Connection refused: connect
- rapadder
- Gbyte level
- Posts: 1897
- Joined: Thu Jun 17, 2004 7:12 pm
- Academic status: Alumnus/a
- Gender: ♂
Re: Σύνδεση JDBC MS SQL Server 2005
Δεν φαίνεται να είναι ανοιχτή. Χρησιμοποίησα το netstat και συγκεκριμένα την επιλογή netstat -a (-a : Displays all active TCP connections and the TCP and UDP ports on which the computer is listening.), όπου το αποτέλεσμα είναι το παρακάτω:
Πρωτόκολλο Τοπική διεύθυνση Εξωτερική διεύθυνση Κατάσταση
TCP si-lab2-21:epmap si-lab2-21:0 LISTENING
TCP si-lab2-21:microsoft-ds si-lab2-21:0 LISTENING
TCP si-lab2-21:1027 si-lab2-21:0 LISTENING
TCP si-lab2-21:1521 si-lab2-21:0 LISTENING
TCP si-lab2-21:2967 si-lab2-21:0 LISTENING
TCP si-lab2-21:3306 si-lab2-21:0 LISTENING
TCP si-lab2-21:3389 si-lab2-21:0 LISTENING
TCP si-lab2-21:3749 si-lab2-21:0 LISTENING
TCP si-lab2-21:8080 si-lab2-21:0 LISTENING
TCP si-lab2-21:24444 si-lab2-21:0 LISTENING
TCP si-lab2-21:netbios-ssn si-lab2-21:0 LISTENING
TCP si-lab2-21:4382 194.63.247.208:http ESTABLISHED
TCP si-lab2-21:4388 194.63.247.208:http ESTABLISHED
TCP si-lab2-21:4403 194.63.247.251:http ESTABLISHED
TCP si-lab2-21:4404 194.63.247.251:http ESTABLISHED
TCP si-lab2-21:doom si-lab2-21:0 LISTENING
TCP si-lab2-21:doom localhost:1026 TIME_WAIT
TCP si-lab2-21:doom localhost:1031 TIME_WAIT
TCP si-lab2-21:doom localhost:1032 TIME_WAIT
κλπ.
Δεν υπάρχει κάτι του στύλ localhost:1434 που θα ήθελα. Είδα και κάποιες οδηγίες How to: Configure a Server to Listen on a Specific TCP Port (SQL Server Configuration Manager) και τις ακολούθησα αλλά τίποτα. Παραθέτω εικόνες από τον SQL Server Configuration Manager:


Πρωτόκολλο Τοπική διεύθυνση Εξωτερική διεύθυνση Κατάσταση
TCP si-lab2-21:epmap si-lab2-21:0 LISTENING
TCP si-lab2-21:microsoft-ds si-lab2-21:0 LISTENING
TCP si-lab2-21:1027 si-lab2-21:0 LISTENING
TCP si-lab2-21:1521 si-lab2-21:0 LISTENING
TCP si-lab2-21:2967 si-lab2-21:0 LISTENING
TCP si-lab2-21:3306 si-lab2-21:0 LISTENING
TCP si-lab2-21:3389 si-lab2-21:0 LISTENING
TCP si-lab2-21:3749 si-lab2-21:0 LISTENING
TCP si-lab2-21:8080 si-lab2-21:0 LISTENING
TCP si-lab2-21:24444 si-lab2-21:0 LISTENING
TCP si-lab2-21:netbios-ssn si-lab2-21:0 LISTENING
TCP si-lab2-21:4382 194.63.247.208:http ESTABLISHED
TCP si-lab2-21:4388 194.63.247.208:http ESTABLISHED
TCP si-lab2-21:4403 194.63.247.251:http ESTABLISHED
TCP si-lab2-21:4404 194.63.247.251:http ESTABLISHED
TCP si-lab2-21:doom si-lab2-21:0 LISTENING
TCP si-lab2-21:doom localhost:1026 TIME_WAIT
TCP si-lab2-21:doom localhost:1031 TIME_WAIT
TCP si-lab2-21:doom localhost:1032 TIME_WAIT
κλπ.
Δεν υπάρχει κάτι του στύλ localhost:1434 που θα ήθελα. Είδα και κάποιες οδηγίες How to: Configure a Server to Listen on a Specific TCP Port (SQL Server Configuration Manager) και τις ακολούθησα αλλά τίποτα. Παραθέτω εικόνες από τον SQL Server Configuration Manager:
... Γράφτε κώδικα όσο είναι καιρός ...
- tsilochr
- Wow! Terabyte level
- Posts: 3246
- Joined: Tue Mar 16, 2004 2:47 pm
- Academic status: PhD
- Gender: ♂
- Location: mm.aueb.gr
- Contact:
Re: Σύνδεση JDBC MS SQL Server 2005
κάποιο firewall (ίσως το built-in των windows) που κόβει την θύρα? αν χρησιμοποιείς το windows firewall κοίτα στις εξαιρέσεις, ίσως χρειαστεί να προσθέσεις με το χέρι την θύρα.
Επιπλέον, δεν ξέρω πως λειτουργεί ο SQL Server αλλά στην εικόνα που παραθέτεις έχεις βάλει να ακούει στο 127.0.0.1 - παρόμοια ρύθμιιση σε άλλα προγράμματα (μου φαίνεται και στο ssh server) δεν σε αφήνει να γίνουν συνδέσεις στο δημόσιο interface
Επιπλέον, δεν ξέρω πως λειτουργεί ο SQL Server αλλά στην εικόνα που παραθέτεις έχεις βάλει να ακούει στο 127.0.0.1 - παρόμοια ρύθμιιση σε άλλα προγράμματα (μου φαίνεται και στο ssh server) δεν σε αφήνει να γίνουν συνδέσεις στο δημόσιο interface
- rapadder
- Gbyte level
- Posts: 1897
- Joined: Thu Jun 17, 2004 7:12 pm
- Academic status: Alumnus/a
- Gender: ♂
Re: Σύνδεση JDBC MS SQL Server 2005
Έχω βάλει σχετικά exceptions στο Windows Firewall (για τις θύρες 1434, 1433). Η 127.0.0.0 είναι η default διεύθυνση για τον SQL Server. Υπάρχει και η πιθανότητα να είναι λάθος το connection string αλλά δεν νομίζω.
... Γράφτε κώδικα όσο είναι καιρός ...
- P@radox
- Kilobyte level
- Posts: 486
- Joined: Tue Nov 09, 2004 4:50 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Among The Few..
- Contact:
Re: Σύνδεση JDBC MS SQL Server 2005
Δοκιμασες και με το Name του SQL Server σου..? Συνηθως δεν ειχα καποιο προβλημα με τον SQL Server και την Java...
Ισως θα ηθελες να ρίξεις μια ματια και στον jTDS JDBC Driver ...ειναι αρκετα καλος..
Ισως θα ηθελες να ρίξεις μια ματια και στον jTDS JDBC Driver ...ειναι αρκετα καλος..
- rapadder
- Gbyte level
- Posts: 1897
- Joined: Thu Jun 17, 2004 7:12 pm
- Academic status: Alumnus/a
- Gender: ♂
Re: Σύνδεση JDBC MS SQL Server 2005
Εγκατέστησα τον jTDS JDBC Driver και αυτό με βοήθησε στο να καταλάβω ποιό είναι το λάθος. Τροποποίησα τον κώδικα και μου βγάζει ένα αντίστοιχο μήνυμα:
SQLException: Network error IOException: Connection refused: connect.
Με βάση το documentation του driver αυτό το λάθος συμβαίνει για τους παρακάτω λόγους:
Why do I get java.sql.SQLException: "Network error IOException: Connection refused: connect" when trying to get a connection?
The "Connection refused" exception is thrown by jTDS when it is unable to connect to the server. There may be a number of reasons why this could happen:
The server name is misspelled or the port number is incorrect.
SQL Server is not configured to use TCP/IP. Either enable TCP/IP from SQL Server's Network Utility app or have jTDS connect via named pipes (see the URL format for information on how to do this).
There is a firewall blocking port 1433 on the server.
To check whether TCP/IP is enabled and the port is not blocked you can use "telnet <server_host> 1433". Until telnet doesn't connect, jTDS won't either. If you can't figure out why, ask your network administrator for help.
Από τα παραπάνω ισχύει το τρίτο. Γράφοντας telnet localhost 1433 (όπως και telnet localhost 1434, telnet localhost) το μήνυμα που πήρα ήταν το ίδιο:
Connecting To localhost...Could not open connection to the host, on port 1433: Connect failed.
Με βάση τα παραπάνω πάω να ανοίξω την θύρα 1433 από τις ρυθμίσεις του router.
SQLException: Network error IOException: Connection refused: connect.
Με βάση το documentation του driver αυτό το λάθος συμβαίνει για τους παρακάτω λόγους:
Why do I get java.sql.SQLException: "Network error IOException: Connection refused: connect" when trying to get a connection?
The "Connection refused" exception is thrown by jTDS when it is unable to connect to the server. There may be a number of reasons why this could happen:
The server name is misspelled or the port number is incorrect.
SQL Server is not configured to use TCP/IP. Either enable TCP/IP from SQL Server's Network Utility app or have jTDS connect via named pipes (see the URL format for information on how to do this).
There is a firewall blocking port 1433 on the server.
To check whether TCP/IP is enabled and the port is not blocked you can use "telnet <server_host> 1433". Until telnet doesn't connect, jTDS won't either. If you can't figure out why, ask your network administrator for help.
Από τα παραπάνω ισχύει το τρίτο. Γράφοντας telnet localhost 1433 (όπως και telnet localhost 1434, telnet localhost) το μήνυμα που πήρα ήταν το ίδιο:
Connecting To localhost...Could not open connection to the host, on port 1433: Connect failed.
Με βάση τα παραπάνω πάω να ανοίξω την θύρα 1433 από τις ρυθμίσεις του router.
... Γράφτε κώδικα όσο είναι καιρός ...
- P@radox
- Kilobyte level
- Posts: 486
- Joined: Tue Nov 09, 2004 4:50 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Among The Few..
- Contact:
Re: Σύνδεση JDBC MS SQL Server 2005
..ωχ.. δεν καταλαβα οτι επαιζες δικτυακα..!..Με βάση τα παραπάνω πάω να ανοίξω την θύρα 1433 από τις ρυθμίσεις του router.
Σε οτι αφορα το jTDS με εχει αφησει πολυ ευχαριστημένο..! Συνεργάζεται και αψογα με το Persistence API..!
- rapadder
- Gbyte level
- Posts: 1897
- Joined: Thu Jun 17, 2004 7:12 pm
- Academic status: Alumnus/a
- Gender: ♂
Re: Σύνδεση JDBC MS SQL Server 2005
Παρατάω τα σχετικά με το port forwarding από τον router και κάνω κάτι αντίστοιχο. Η λύση στο πρόβλημα μου περιγράφεται σε αυτό το link και ακολουθώ τις οδηγίες.
... Γράφτε κώδικα όσο είναι καιρός ...
- tsilochr
- Wow! Terabyte level
- Posts: 3246
- Joined: Tue Mar 16, 2004 2:47 pm
- Academic status: PhD
- Gender: ♂
- Location: mm.aueb.gr
- Contact:
Re: Σύνδεση JDBC MS SQL Server 2005
δώσε μια περιγραφή του τι κάνεις και σε δικτυακή υποδομή πας να κάνεις ό,τι κάνεις. Το πρόβλημα πρέπει να είναι καθαρά δικτυακό
- rapadder
- Gbyte level
- Posts: 1897
- Joined: Thu Jun 17, 2004 7:12 pm
- Academic status: Alumnus/a
- Gender: ♂
Re: Σύνδεση JDBC MS SQL Server 2005
Επιτέλους έβγαλα άκρη. Μετά από πολλές δοκιμές βρήκα ότι με λειτουργεί στην 127.0.0.1:2449/. Μάλιστα το δοκίμασα (αρχικά) με τους DataDirect jdbc drivers, στην προσπάθεια μου να λύσω ένα άλλο error κλπ. Τώρα χρησιμοποιώ τους jTDS jdbc drivers (που είναι και δωρεάν). Παραθέτω τις ρυθμίσεις του SQL Server Configuration Manager με τις οποίες λειτουργεί. Ευχαριστώ για τις απαντήσεις.

Δύο σημαντικές παρατηρήσεις:
1. Η εκάστοτε διεύθυνση στην οποία πρέπει να συνδεθείς είναι η 127.0.0.1:port, όπου η port είναι αυτή που εμφανίζεται στο πεδίο TCP Dynamic Ports του IPAll, όπως φαίνεται στην εικόνα. Με ένα telnet 127.0.0.1:port επιβεβαιώνεις ότι είναι ανοιχτή. Για παράδειγμα στην πάνω εικόνα είναι η 2449, ενώ στην κάτω εικόνα η 3749.

2. Δεν θα πρέπει να ξέχασει κάποιος να ορίσει στον MS SQL Server έναν χρήστη (από τον Object Explorer: Security -> δεξί κλικ στο Logins). Π.χ. ο παρακάτω κώδικας χρησιμοποιεί τον χρήστη sa που ορίζει ο MS SQL Server by default, που έχει password αυτό που συμπληρώθηκε κατά την εγκατάσταση:
DriverManager.getConnection("jdbc:jtds:sqlserver://127.0.0.1:3749/", "sa", "my_password");

Δύο σημαντικές παρατηρήσεις:
1. Η εκάστοτε διεύθυνση στην οποία πρέπει να συνδεθείς είναι η 127.0.0.1:port, όπου η port είναι αυτή που εμφανίζεται στο πεδίο TCP Dynamic Ports του IPAll, όπως φαίνεται στην εικόνα. Με ένα telnet 127.0.0.1:port επιβεβαιώνεις ότι είναι ανοιχτή. Για παράδειγμα στην πάνω εικόνα είναι η 2449, ενώ στην κάτω εικόνα η 3749.

2. Δεν θα πρέπει να ξέχασει κάποιος να ορίσει στον MS SQL Server έναν χρήστη (από τον Object Explorer: Security -> δεξί κλικ στο Logins). Π.χ. ο παρακάτω κώδικας χρησιμοποιεί τον χρήστη sa που ορίζει ο MS SQL Server by default, που έχει password αυτό που συμπληρώθηκε κατά την εγκατάσταση:
DriverManager.getConnection("jdbc:jtds:sqlserver://127.0.0.1:3749/", "sa", "my_password");
... Γράφτε κώδικα όσο είναι καιρός ...