Avatar billede andersbl Nybegynder
25. februar 2010 - 14:50 Der er 21 kommentarer og
1 løsning

JDBC Driver til SQL server 2008

Hej Eksperter
Jeg har ført kørt på en SQL Server 2000, men er for nylig blevet opgraderet til 2008. I den sammenhæng har jeg prøvet at opdatere in JDBC driver på min tomcat-server der køre intern. Det her problemet kommer.

Jeg har downloadet: Microsoft SQL Server JDBC Driver 2.0
http://www.microsoft.com/downloads/details.aspx?FamilyID=99B21B65-E98F-4A61-B811-19912601FDC9&displaylang=en

jeg har lagt "sqljdbc4.jar" ind i "C:\apache-tomcat-5.5.27\common\lib"
og slettede de tre tidligere jar filer der blev brugt til JDBC forbindelse.

Koden som jeg køre er følgende:
(div)
<!doctype html public "-//w3c/dtd HTML 4.01 Transitional//en">
<%@ page import="java.sql.*, java.util.Calendar, java.util.Date" %>
<html>
<head>
<title>Test af forbindelse</title>
</head>
<body>
<%
try {
Connection con = null;
Statement stmt = null;

con = DriverManager.getConnection("jdbc:microsoft:sqlserver://SERVERNAVN:1433;integratedSecurity=true");
stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * FROM medlemmere");
while (rs.next())
{
    System.out.print(rs.getString(1));
    System.out.print("\t" + rs.getString(3));
    System.out.println("\t" + rs.getString(2));
}
out.write("VIRKER");

Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
out.write("\n" + cal.getTime());
}
/*
catch (java.lang.ClassNotFoundException e) {
  System.err.println("ClassNotFoundException: "  +e.getMessage());
} */
catch (SQLException e) {
  System.err.println("SQLException: " +e.getMessage());
}
           
%>
</body>
</html>
(/div)

Når jeg kører programmet får jeg følgende fejlmeddelse
(div)
SQLException: No suitable driver
(/div)

Nogle der kan hjælpe???
Avatar billede arne_v Ekspert
25. februar 2010 - 15:38 #1
Hvor er Class.forName til at loade driveren med?
Avatar billede arne_v Ekspert
25. februar 2010 - 15:39 #2
Check ioevrigt om ikke den nye JDBC driver kun bruger jdbc:sqlserver://blabla for connection string.
Avatar billede andersbl Nybegynder
25. februar 2010 - 16:31 #3
Grunden til jeg ikke har Class.forName, er fordi jeg har læst det he r:
"In the JDBC API 4.0, the DriverManager.getConnection method is enhanced to load JDBC drivers automatically. Therefore, applications do not need to call the Class.forName method to register or load the driver when using the sqljdbc4.jar class library."

Jeg har også prøvet at skrive:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

Hvilket ikke ændre på problemet.
Avatar billede andersbl Nybegynder
25. februar 2010 - 16:32 #4
Forresten denne sige jeg har fået mine informationer fra
http://msdn.microsoft.com/en-us/library/ms378526.aspx
Avatar billede arne_v Ekspert
25. februar 2010 - 16:39 #5
Har du proevet at aendre connection URL?

jdbc:microsoft:sqlserver
->
jdbc:sqlserver

?
Avatar billede andersbl Nybegynder
25. februar 2010 - 16:48 #6
Nej, skriver lige når jeg har afprøvet det.
Avatar billede arne_v Ekspert
28. februar 2010 - 02:59 #7
Nu har jeg testet hos mig.

Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost;DatabaseName=Test", "xxxx", "xxxx");

virker.

Både med og uden:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

Af en eller anden skummel årsag kan jeg ikke få integrated security til at virke:

Connection con = DriverManager.getConnection("jdbc:sqlserver://localhost;DatabaseName=Test;IntegratedSecurity=true");
Avatar billede andersbl Nybegynder
02. marts 2010 - 08:53 #8
Så har jeg prøvet igen. Men desværre uden held.
Jeg har skrevet følgende:


Statement stmt = null;
Connection con = DriverManager.getConnection("jdbc:sqlserver://SERVERNAVN;DatabaseName=TEST","BRUGERNAVN","PASSWORD");
stmt = con.createStatement();


Jeg får stadig den samme fejl.
"SQLException: No suitable driver"

Om jeg skriver, gør det ikke nogen forskel:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

Den jar fil jeg har lagt på tomcat severen hedder "sqljdbc4.jar" har du brugt den samme?
Har slettet alle tidligere SQL drivere, (var 3 med sql server 2000) og lagt sqljdbc4.jar i C:\apache-tomcat-5.5.27\common\lib
Avatar billede arne_v Ekspert
02. marts 2010 - 14:15 #9
Jeg testede ogsaa med sqljdbc4.jar - dog ikke i Tomcat.

Lidt mystisk.

Kan du faa du det til at virke i en helloworld console app ?
Avatar billede andersbl Nybegynder
02. marts 2010 - 14:53 #10
jeg har fået forbindelse til SQL severen nu, ved hjælp af "sqljdbc.jar".
NU er mit problem som ud også havde at Integrated Security ikke virker. Jeg har fundet ud af det ikke virker, pga. der skal ligge en fil som hedder "sqljdbc_auth.dll". Den har jeg hentet, men da jeg køre det intern på min computer, og senere smider det ud på den eksterne Tomcat server, prøver jeg at finde en løsning til dette.

Der står man skal ligge den på C:/Windows/Windoew32 osv. men kan ikke rigtig bruge det til så meget, da der er mange computere som skal køre det. Jeg vil gerne kunne tilføje filen i BuildPath, men i Eclipse kan jeg kun se jeg kan tilføje JAR eller ZIP filer.

Kunne være rart hvis jeg kunne ligge filen sammen med jar filen på tomcat severen så den ikke ligger lokalt.
Avatar billede andersbl Nybegynder
02. marts 2010 - 16:52 #11
Hej
Nu har jeg fået det til at virke tror jeg. Jeg hentede en 3.0 driver der udkom igår, og fik en ny fejlmeddelse. Har nu tilføjet -Djava.library.path="C:\Microsoft SQL Server JDBC Driver 3.0\sqljdbc_3.0\enu\auth\x86"  i mit VM arguments i eclipse.

Jeg får nu fejlmeddelsen:
SQLException: Cannot open database "dmbd" requested by the login. The login failed.

Hvilket jeg jeg tror/håber at er pga. jeg ikke har rettigheder til databasen. Får en hjælper til at give mig rettigheder til databasen på fredag og håber på at det så viser sig at det virker der.

Mit spørgsmål til dig er nu:
Jeg har tilføjet sætningen i VM arguments i eclipse på min computer. Kan man tilføje det et sted så den ikke det er "mere" eksternt. Forstået på den måde, at jeg ved ikke om det virker på en tomcat server, hvis jeg kun har ændret på VM argument men på egen computer.
Avatar billede arne_v Ekspert
02. marts 2010 - 20:27 #12
Integrated security kræver at Java kan finde sqljdbc_auth.dll og det kan Java kun hvis den enten er i den almindelige PATH eller i java.library.path !

Det kræver iøvrigt også at det kører på Windows. Det virker ikke på Linux.

For brug i Tomcat giver det 3 muligheder:

1)  du beder sysadm om at putte det dir i PATH
2)  du beder sysadm starte Tomcat med -Djava.library.path=
3)  du dropper integrated security
Avatar billede arne_v Ekspert
02. marts 2010 - 20:28 #13
#3 er faktisk bedst efter min mening.

A)  Det vil virke i en Tomcat/Linux - SQLServer/Windows konfiguration.

B)  Du bør alligevel ikke bruhe DriverManager.getConnection i en web app, men hente en DataSource via JNDI. Og så ligger password i Tomcat's konfiguration ikke i din web app.
Avatar billede andersbl Nybegynder
02. marts 2010 - 20:59 #14
Tak for svaret. Grunden til at jeg vil benytte integrated security, er pga af sikkerhed om hvem der har adgang til hvilke tabeller. Det skulle vist også være sådan at hvis der bliver updateret et rækker i en tabel kan man præcis se hvem der har fortaget hvad i detaljer.

Med det du nævner kan det give samme sikkerhed og information?
Du må gerne komme med forslag til andre ideer i stedet for integrated security.
Avatar billede arne_v Ekspert
02. marts 2010 - 21:03 #15
Det kan du jo alligevel ikke i Tomcat.

Alle connectiosn fra Tomcat vil se ud som brugernavnet er det brugernavn som Tomcat kører under.

Nej - Tomcat kan ikke lave impersonation.
Avatar billede arne_v Ekspert
02. marts 2010 - 21:04 #16
Vejen frem må være:

* et brugernavn/password i connection pool definitionen

* du bruger Tomcat brugere/roller til i web app at holde styr op hvem der har adgang til hvad
Avatar billede andersbl Nybegynder
02. marts 2010 - 21:05 #17
Tak for svaret. Grunden til at jeg vil benytte integrated security, er pga af sikkerhed om hvem der har adgang til hvilke tabeller. Det skulle vist også være sådan at hvis der bliver updateret et rækker i en tabel kan man præcis se hvem der har fortaget hvad i detaljer.

Med det du nævner kan det give samme sikkerhed og information?
Du må gerne komme med forslag til andre ideer i stedet for integrated security.
Avatar billede andersbl Nybegynder
04. marts 2010 - 08:29 #18
Jeg prøver i morgen og se hvordan Tomcat reagere på forbindelsen, om der er en form for brugernavn der kommer med over.

Maskinerne der kommer til at bruge den forbindelse køre alle sammen i Win Xp.

Dit forslag på:
* et brugernavn/password i connection pool definitionen
kan du forklare det mere i detaljer.

Grunden til jeg sidder og leger med alt det her, er pga. jeg har en reversioner der står og banker mig i hoved om at få så meget sikkerhed som muligt, ud fra hvem der der sletter, opdaterer, opretter i databasen.
Avatar billede arne_v Ekspert
04. marts 2010 - 17:28 #19
DriverManager.getConnection er ikke en god måde at hente database connections på i en web applikation.

Det er ret dyrt at lave en connection til databasen. Så performance er dårlig.

I.s.f. bør man bruge connection pool.

Man definerer:
- pool navn
- driver klasse
- connection url
- username og password
- antal connections i pool
i serverens konfiguration.

Så laver serveren de N fysiske connections ved opstart og genbruger dem.

Når app beder om en connection så laves der ikke en ny fysisk connection, men man reserverer en allerede åben fysisk connection. Og close lukker ikke den fysiske connection men markerer den bare som værende fri.
Avatar billede arne_v Ekspert
04. marts 2010 - 17:29 #20
I.s.f.:

Class.forName(drvclznam);
Connection con = DriverManager.getConnection(foobarconutl, "xxxx", "xxxx");
...
con.close();

bruger du:

Context ctx = (Context) init.lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup("jdbc/Foobar");
Connection con = ds.getConnection();
...
con.close();
Avatar billede arne_v Ekspert
04. marts 2010 - 17:30 #21
Security skal logge web brugernavnet ikke database brugernavnet.
Avatar billede arne_v Ekspert
26. april 2010 - 03:49 #22
OK ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester