Avatar billede michael_borup Nybegynder
21. februar 2002 - 13:18 Der er 4 kommentarer og
1 løsning

Samtidig adgang til SQL Server

Hvis 2 eller flere klienter tilgår denne side på samme tid (dvs. indenfor samme sekund) opstår der en SQL exception. Hvorfor får jeg denne exception og hvordan undgår jeg den?

På forhånd tak

PLATFORM
OS: MS Windows 2000 server
IS: MS IIS 5.0
AP: Tomcat 3.2
DB: MS SQL server 2000

JSP
<%@ page import="java.sql.*" errorPage="error.jsp"%>

<%!
  Connection connection;
  Statement statement;
  ResultSet rs;
%>

<%
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  connection = DriverManager.getConnection("jdbc:odbc:mydb", "", "");
  statement = connection.createStatement();
  rs = statement.executeQuery("SELECT * FROM mytabel;");
%>

<HTML>

<HEAD>
</HEAD>

<BODY>
<%
  while (rs.next()) {
    out.println(rs.getString(1));
    out.println(rs.getString(2));
    out.println(rs.getString(3));
    out.println(rs.getString(4));
    out.println(rs.getString(5));
    out.println(rs.getString(6));
    out.println(rs.getString(7));
    out.println(rs.getString(8));
    out.println(rs.getString(9));
    out.println("<br>");
  }

  if (rs != null) rs.close();
  if (statement != null) statement.close();
  if (connection != null) connection.close();
%>
</BODY>
</HTML>
Avatar billede disky Nybegynder
21. februar 2002 - 17:15 #1
Skift tomcat ud, specielt versioner før V4 er totalt dårligt og fyldt med fejl.

Nu bruger jeg aldrig odbc bridgen (er langsom) men kobler altid direkte op imod databasen, derfor er jeg lidt i tvivl om du ikke skulle tage og angive server navn i din getConnection();

Det er en meget dårlig vane at bruger getString(int) istedet for getString(String), hvis der pludseligt bliver lavet om på rækkefølgen af kolonner dør dit program.


Hvad siger den exception ?

Hvorfor catcher du den ikke i din kode ?
Avatar billede soelvpil Nybegynder
21. februar 2002 - 17:50 #2
Fejlen opstår, fordi de to (eller flere brugere) benytter samme Connection, Statement og ResultSet. Sandsynligvis sker det fordi de to brugere render igennem det samme ResultSet, og derfor påvirker hinandens resulteter.

Den letteste løsning vil være at fjerne udråbstegnet ierklæringen af variabler. Så vil de to brugere ikke længere dele samme instanser af variablerne, og dine problemer skulle være løst (men det performer nok lidt langsommere for bruger to, men det er vel bedre end hvis dte slet ikke virker!!)

Måske kan du speede performance en lile smule op ved at bruge PreparedStatements, f.eks.

PreparedStatement prepStmt = connection.prepareStatement("SELECT * FROM mytabel;");
rs = prepStmt.executeQuery();

Det vil få de fleste databser til at performe en smule hurtigere.
Endelig kan en Connectionpool speede tingene yderligere op, hvis det senere viser sig nødvendigt.

Så det er slet ikke Tomcats skyld!
Avatar billede michael_borup Nybegynder
22. februar 2002 - 11:38 #3
Tak for svarene. Ved at fjerne "!" virker siden efter hensigten.
Avatar billede michael_borup Nybegynder
22. februar 2002 - 14:18 #4
Mange tak for svarene. Ved at fjerne "!" virker siden efter hensigten.
Avatar billede disky Nybegynder
22. februar 2002 - 14:36 #5
Måske er det ikke tomcats skyld, men den er kendt for at være ret dårlig og fejlfyldt.

Hovedproblemmet her er der faktisk endnu, nemlig det at det er meget dårligt design at blande design (html/jsp) med funktionalitet (java klasser).

Brug jsp til at have html i som kalder java beans via custom tags.

Havde du gjort dette fra starten var dit problem aldrig opstået.
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