Avatar billede jademutter Nybegynder
28. november 2005 - 13:26 Der er 6 kommentarer og
1 løsning

JSP og samtidighed

Hej Alle

Jeg har lavet et lille simpelt nyhedssystem, hvor en håndfuld brugere kan logge ind og oprette nyheder på en hjemmeside.
Systemet består af nogle JSP sider som skriver til en MySql-database.
Problemet er nu at 2 brugere, i 9 ud af 10 tilfælde, sidder og opretter nyheder samtidigt, med det resultat at den ene nyhed ikke bliver skrevet i databasen.
Hvordan kan jeg fixe dette problem, jeg har lidt kendskab til tråd-programmering, men ikke på J2EE?

/Jademutter
Avatar billede fsconsult.dk Nybegynder
29. november 2005 - 08:16 #1
Dit problem er nok ikke noget med tråde at gøre (JSP er implicit trådede allerede).

Du forsøger formentlig at oprette en to nyheder med samme nøgler, hvilket vil få en af dem til at fejle.
Den simpleste løsning på dette problem, er at lade MySQL generere nøglen.
Avatar billede jademutter Nybegynder
29. november 2005 - 17:07 #2
Hej igen

På nuværende tidspunkt oprettes nyheden bare med "null" og MySQL incrementere derefter selv primær-nøglen.
Brugeren indtaster oplysningerne i en formular der sendes til databasen, når der trykkes "opret".
Der foregår derfor ikke noget samtidighed på databasen, med mindre de 2 brugere trykker på nøjagtig samme tid, og det finder jeg meget usandsynligt.

/Jademutter
Avatar billede fsconsult.dk Nybegynder
29. november 2005 - 17:47 #3
selv hvis brugerne trykker præcist samme tid, bør det ikke give problemer, hvis du gør som du beskriver ....  men der må komme en fejl fra mysql, som fortæller mere om hvad der går galt...
Avatar billede trp79 Nybegynder
01. december 2005 - 17:51 #4
Hvis du ikke har fået det løst, vil du ikke prøve at poste db koden, og koden der berøres når du trykker opret nyhed...
Avatar billede jademutter Nybegynder
01. december 2005 - 22:33 #5
Jeg kan ikke lige finde nogen fejl i MySql, så jeg prøver lige at poste min kode til de 3 filer:

1.opret_artikel.jsp
<jsp:useBean id="ad" class="fbc.artikelData" scope="session"/>
<%

// se om attributten "logget ind" er sat i sessionen
if (session.getAttribute("logget ind") == null) {
// brugeren er ikke logget ind, så send ham tilbage til login-siden
response.sendRedirect("login.jsp");
}

%>
<html>
<head>
<script language="javascript">

function validateForm(){
var d = document.forms['upform'];
var text = d.overskrift;
var text1 = d.indhold;

if(text.value == '')
{
alert('Indtast venligst en overskrift');
text.focus();
return false;
}

else if(text1.value == '')
{
alert('Indtast venligst noget indhold');
text1.focus();
return false;
}
}
</script>

</head>
<BODY>
<h1>Opret nyhed</h1>
<form method="post" action="send_artikel.jsp" name="upform" enctype="multipart/form-data" onClick="return validateForm();">
<p><b>Overskrift:</b>
<INPUT TYPE=TEXT NAME=overskrift SIZE=45></p>
<BR><b>Indhold:</b><br>
<textarea rows="10" name="indhold" cols="50"></textarea><br>
<p><b>Send en E-mail med denne nyhed til:</b></p>
<p><input type="checkbox" name="faxebugten" value="faxebugten">FaxeBugten (faxebugten@4640.dk)</p>
<p><input type="checkbox" name="radio" value="radio">Studiet på Lokalradioen (studiet@lokalradio.dk)</p>
<p><input type="checkbox" name="sjaellandske" value="sjaellandske">Sjællandske (haslev.red@sj-medier.dk)</p>
<p><input type="checkbox" name="jang" value="jang">Jan G. Nielsen (jgn@lokalradio.dk)</p>
<p><input type="checkbox" name="dagbladet" value="dagbladet">Dagbladet (haslev.red@db-faa.dk)</p>
<p><input type="checkbox" name="andre" value="andre">Andre E-Mail:<input type=text name="andrewho" size=30>(adskilt af komma)</p>
<p><b>Tilføj billede: </b><input type="file" name="uploadfile" size="50"><input type="hidden" name="todo" value="upload"> (Kun .jpg og .gif filer og max 1 MB)</p><br>
<input type="reset" name="Reset" value="Fortryd">
<input type="submit" value="Opret">
</FORM>
</BODY>
</HTML>

2.send_artikel.jsp
<jsp:useBean id="ad" class="fbc.artikelData" scope="session"/>
<jsp:useBean id="mail" class="fbc.SimpleSendMessage" scope="session"/>
<%@ page language="java" import="javazoom.upload.*,java.util.*" %>
<%@ page errorPage="error.jsp" %>
<jsp:useBean id="upBean" scope="page" class="javazoom.upload.UploadBean" >
<jsp:setProperty name="upBean" property="folderstore" value="/home/virtual/site196/fst/var/www/html/billeder/upload" />
</jsp:useBean>
<%

// se om attributten "logget ind" er sat i sessionen
if (session.getAttribute("logget ind") == null) {
// brugeren er ikke logget ind, så send ham tilbage til login-siden
response.sendRedirect("login.jsp");
}

%>
<html>
<BODY>
<%
MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);

String[] sendtil = new String[25];
String sendttil ="";
String pic="Du har ikke oploadet noget billede til artiklen";

if (MultipartFormDataRequest.isMultipartFormData(request))
{
// Uses MultipartFormDataRequest to parse the HTTP request.
String todo = null;

upBean.setWhitelist("*.jpg,*.gif"); //Tilladte filtyper
upBean.setFilesizelimit(1000000); //Max størrelse i bytes

if (mrequest != null) todo = mrequest.getParameter("todo");
if ( (todo != null) && (todo.equalsIgnoreCase("upload")) )
{
Hashtable files = mrequest.getFiles();
if ( (files != null) && (!files.isEmpty()) )
{
UploadFile file = (UploadFile) files.get("uploadfile");
pic = file.getFileName();

// Uses the bean now to store specified by jsp:setProperty at the top.
upBean.store(mrequest, "uploadfile");
}
else
{
pic="";
}
}
else out.println("<BR> todo="+todo);
}

String test = mrequest.getParameter("checkbox");
String overskrift = mrequest.getParameter("overskrift");
String indhold = mrequest.getParameter("indhold");
String user = session.getAttribute("bruger").toString();

ad.skrivArtikel(overskrift,indhold,user,pic);

if (pic==null)
{
pic="Du har ikke oploadet noget billede til artiklen";
}

if (mrequest.getParameter("faxebugten")!=null)
{
mail.SendMail("faxebugten@4640.dk","webmaster@faksebadminton.dk",overskrift,indhold);
sendttil+="Faxebugten, ";
}

if (mrequest.getParameter("radio")!=null)
{
mail.SendMail("studiet@lokalradio.dk","webmaster@faksebadminton.dk",overskrift,indhold);
sendttil+="Studiet på lokalradioen, ";
}

if (mrequest.getParameter("dagbladet")!=null)
{
mail.SendMail("haslev.red@db-faa.dk","webmaster@faksebadminton.dk",overskrift,indhold);
sendttil+="Dagbladet, ";
}

if (mrequest.getParameter("sjaellandske")!=null)
{
mail.SendMail("haslev.red@sj-medier.dk","webmaster@faksebadminton.dk",overskrift,indhold);
sendttil+="Sjællandske, ";
}

if (mrequest.getParameter("jang")!=null)
{
mail.SendMail("jgn@lokalradio.dk","webmaster@faksebadminton.dk",overskrift,indhold);
sendttil+="Jan G. Nielsen, ";
}

if (mrequest.getParameter("andre")!=null)
{
String resultat="";

int j=0;
StringTokenizer st = new StringTokenizer(mrequest.getParameter("andrewho"),",");

while (st.hasMoreTokens())
{
resultat=st.nextToken();
mail.SendMail(resultat,"webmaster@faksebadminton.dk",overskrift,indhold);
sendttil+=resultat;
}
}
%>
<h1>Tillykke</h1>
<p>Du har nu oprettet en ny artikel i databasen, med flg. oplysninger:</p>
<ul>
<li><b>Overskrift: </b> <%= overskrift %></li>
<li><b>Indhold: </b> <%= indhold %></li><br>
<li><b>Billede: </b> <%= pic %></li><br>
<li><b>Nyheden er sendt til: </b><%= sendttil %></li>
</ul>
<a href="http://www.faksebadminton.dk">Tilbage til Forsiden</a><br>
<a href="http://www.faksebadminton.dk/intranet/opret_artikel.jsp">Tilføj flere nyheder</a>
</BODY>
</HTML>

3.artikelData.java
import java.sql.*;
import java.util.*;

public class artikelData
{
public void skrivArtikel(String goverskrift, String gindhold, String guser, String pic)
{

java.util.GregorianCalendar calendar = new java.util.GregorianCalendar();

String saeson=""+calendar.get(Calendar.YEAR)+"_"+(calendar.get(Calendar.YEAR)+1)+"";
String bruger=guser;
String id=null;//Så databasen ved at den skal autonummerer
String overskrift=goverskrift;
String indhold=gindhold;
String dato= ""+ calendar.get(Calendar.DAY_OF_MONTH) +"-" + (calendar.get(Calendar.MONTH)+1) +"-"+calendar.get(Calendar.YEAR)+"";;
String image = pic;

if((calendar.get(Calendar.MONTH)+1)<=6)
{
saeson=""+(calendar.get(Calendar.YEAR)-1)+"_"+(calendar.get(Calendar.YEAR))+"";
}

try
{
Class.forName("com.mysql.jdbc.Driver");//forbindelse til databasen oprettes
Connection con= DriverManager.getConnection("jdbc:mysql://XXXX","XXXX","XXXX");

Statement s= con.createStatement();    //opretter sætningsobjektet
s.execute("INSERT INTO artikler VALUES (" + id + ",'" + dato + "','" + overskrift + "','" + indhold + "','" + bruger + "','" + saeson + "','" + image + "')");
s.close();
con.close();

}
catch(Exception ex)
{
ex.toString();
}
}
}

/Jademutter
02. december 2005 - 02:40 #6
Hej Jademutter

Kan du ikke lade dine Jsp implementere SingleThreadModel.(Ved det kan lade sig gøre med Servlet)

og ændre din public void skrivArtikel(String goverskrift.....metode
til synchronized
Avatar billede arne_v Ekspert
02. december 2005 - 03:13 #7
<%@page isThreadSafe="false"%>
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