2012-01-24 17 views
8

Tôi đang cố viết một ứng dụng GUI đơn giản để chèn một số bản ghi vào cơ sở dữ liệu và đọc lại một số bản ghi (không có gì ưa thích, chỉ 1 bảng với 3 hàng, không quan hệ). Nguồn ...Java7 sqljdbc4 - Lỗi SQL 08S01 trên getConnection()

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 
     { 

Lỗi ở đây

  connect = dSource.getConnection(); 

cuối lỗi

 } 
     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(); 
     } 
    } 

tôi nhận được lỗi sau ...

(code) 0

(tin nhắn) SQL Serv er không trả lời. Kết nối đã bị đóng.

(trạng thái) 08S01

tôi đã xác minh rằng người dùng, vượt qua, tên máy chủ, cổng và tên DB đều chính xác. Nếu tôi thay đổi tên người dùng thành một tên không hợp lệ, tôi nhận được lỗi "không thể đăng nhập" được báo cáo lại vì vậy tôi biết tôi đang truy cập máy chủ.

Tôi không thể kết nối đầy đủ một lần, vì vậy tôi biết đó không phải là vấn đề "quá nhiều kết nối", vì người duy nhất hiện đăng nhập vào máy chủ là tôi qua phòng quản lý sql. Nó không hoạt động khi tôi đăng xuất khỏi đó hoặc là chắc chắn không phải là một vấn đề kết nối #.

Người dùng ứng dụng cũng có quyền truy cập dữ liệu/người lập kế hoạch. (Tôi đang sử dụng Eclipse, nếu điều đó quan trọng. Và tôi đang tham khảo thư viện sqljdbc4.jar).

Tôi không biết phải đi đâu để khắc phục sự cố này. Mọi sự trợ giúp sẽ rất được trân trọng.

EDIT Update - Tôi cũng đã thử một chuỗi kết nối và sử dụng DriverManager.getConnection (connString) để thiết lập kết nối, điều đó không làm việc, hoặc. Kết quả là như nhau. Ngoài ra, SQL server 2008 r2 là phiên bản máy chủ sql tôi đang sử dụng.

EDIT Tôi đã viết một chương trình C# nhanh chóng để kiểm tra kết nối, chắc chắn đủ các kết nối hoạt động tốt trong .net, tiếc là tôi phải sử dụng java cho dự án này (đó là một dự án tôi đã chọn để làm trên của tôi sở hữu cho một lớp, chỉ yêu cầu là nó trong Java ... giáo viên cũng không biết đầu mối gì đang xảy ra).

+0

Hình như tôi có thể phải đặt một bounty trên này>. < –

Trả lời

14

Comment dòng với setEncrypt(true):

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

Bạn có thể gặp rắc rối với các thiết lập mã hóa. Từ các tài liệu setEncrypt(...):

Nếu thuộc tính mã hóa được thiết lập để đúng, trình điều khiển Microsoft SQL Server JDBC sử dụng nhà cung cấp an ninh JSSE mặc định của JVM để đàm phán mã hóa SSL với SQL Server. Nhà cung cấp bảo mật mặc định có thể không hỗ trợ tất cả các tính năng cần thiết để thương lượng mã hóa SSL thành công. Ví dụ, nhà cung cấp bảo mật mặc định có thể không hỗ trợ kích thước của khóa công khai RSA được sử dụng trong chứng chỉ SSL của SQL Server.Trong trường hợp này, nhà cung cấp bảo mật mặc định có thể gây ra lỗi khiến trình điều khiển JDBC chấm dứt kết nối. Để giải quyết vấn đề này, thực hiện một trong các cách sau:

  • Cấu hình SQL Server với một chứng chỉ máy chủ mà có một RSA nhỏ công cộng quan trọng

  • Configure JVM sử dụng một nhà cung cấp an ninh JSSE khác nhau trong "/lib/security/java.security" tài sản bảo đảm nộp

  • Sử dụng một JVM khác nhau

Cập nhật

Với phiên bản Java 1.6.0_29 và 7.0.0_1 Oracle đã giới thiệu một bản vá bảo mật cho SSL/TLS BEAST tấn công mà rất có thể sẽ gây ra những vấn đề rất giống nhau. Sửa chữa bảo mật ở trên được biết là làm cho rắc rối cho các kết nối cơ sở dữ liệu đến máy chủ MSSQL với cả trình điều khiển jTDS và trình điều khiển Microsoft. Bạn có thể

  • quyết định không sử dụng mã hóa bằng cách không sử dụng setEncrypt(true) (như đã nêu ở trên)
  • hoặc, nếu nó được thực thi bởi MSSQL Server, bạn có thể tắt sửa chữa Java trong JVM của bạn bằng cách thiết lập -Djsse.enableCBCProtection=false thuộc tính hệ thống. Được cảnh báo, nó sẽ ảnh hưởng đến tất cả các kết nối SSL trong cùng một máy ảo.
+0

Không thể nhận xét nó ra, vì lý do an ninh dụ SQL server Tôi đang kết nối với lực lượng ssl. Cert là một freebie startcom, vì vậy kích thước RSA không phải là một vấn đề. Tôi thậm chí đã gặp rắc rối khi không sử dụng trustservercert và nhập các chứng chỉ bắt buộc để sử dụng trong Java (khoảng 3 giờ khắc phục sự cố ở đó) mà không có may mắn. Tôi đã nhận được cùng một lỗi 08s01. –

+0

Sau đó, bạn nên thử tắt bản sửa lỗi Oracle cho cuộc tấn công SSL/TLS BEAST trong JVM của bạn bằng cách sử dụng thuộc tính hệ thống '-Djsse.enableCBCProtection = false'. Được cảnh báo, nó sẽ ảnh hưởng đến tất cả các kết nối SSL trong VM. Bản sửa lỗi đã được thêm từ phiên bản 1.6.0_29 và 7.0.0_1. – MicSim

+0

Phụ lục: Bản sửa lỗi bảo mật ở trên được biết là gây rắc rối cho các kết nối cơ sở dữ liệu đến Máy chủ MSSQL. Xem ví dụ: lỗi jTDS # 3468079 (http://sourceforge.net/tracker/index.php?func=detail&aid=3468079&group_id=33291&atid=407762) cũng đề cập đến Trình điều khiển Microsoft. – MicSim

0

Đôi khi, cấu hình động cơ được sửa đổi theo cách không chấp nhận kết nối bên ngoài. Sau khi một số nghiên cứu, sau đây làm việc cho tôi:

  1. mở SQL Server Configuration Manager
  2. Hãy để SQL SERVER Cấu hình mạng
  3. MSSQLSERVER giao thức (Double click)
  4. Xem TCP/IP (phải được bật) (mở)
  5. tới tab "Địa chỉ IP"
  6. Loại thành "TCP Port": 1433
  7. Các kích hoạt và tùy chọn kích hoạt phải được Enabled: Yes
  8. Khởi động lại dịch vụ
+1

Bạn có thể trả lời bằng ngôn ngữ giống như câu hỏi. – igr

+0

@ChristianSolano Chào mừng bạn đến với Stack Overflow! Cảm ơn câu trả lời đầu tiên của bạn. Tuy nhiên, hãy xem xét rằng tiếng Anh là ngôn ngữ chính của trang web và những đóng góp của bạn sẽ thực sự hữu ích hơn cho những người dùng khác nếu được viết bằng ngôn ngữ này. Vui lòng xem [Cần tiếng Anh trên Stack Overflow không?] (Http://meta.stackexchange.com/q/13676/169503). –

Các vấn đề liên quan