Hallo, ich habe ein Problem ,dass mich wirklich stört , deine Hilfe wäre mir unvergesslich. Ich muss für unsere Firma ein Programm schreiben , das unsere MySQL –Datenbank aktualisiert. Auf unsere firmeninterne Web-Server laufen unterschiedliche Webseiten von unseren Kunden . Ich muss ein Programm schreiben , das zählt wie oft jede Webseite aufgerufen wird, und das Ergebnis in eine MySQL – Datenbank speichert .Meine Tabelle enthält 4 Spalten zwar id = enthält die Primärschlüssel der Tabelle, page = enthält die aufgerufene Webseiten, counter = speichert wie oft eine Seite aufgerufen wird, sessioncounter = speichert wie oft eine Seite zum ersten Mal mit der gleichen Session-ID aufgerufen wird. Ich habe eine Klasse SessionObject implementiert,die die aufgerufene Seite und die dazugehörige Session-ID speichert , eine Klasse SessionArray die alle aufgerufene Seiten und Session-ID in einem Puffer(Array) anlegt, und die Daten in die Datenbank über einen Thread schreibt . Die Klasse SessionArray wird von einem Filter LiveStatReceiver ausgeführt .In der Klasse LiveStatReceiver werden die folgenden Variablen deklariert counter(speichert aktuelle Grösse des Arrays) , pagecounter(speichert wie oft eine Seite im Array vorhanden ist) , objectArray(Array von Typ SessionObject in dem alle aufgerufenen Seiten und Session-ID angelegt sind) und an einer Instanz der Klasse SessionArray als Konstruktor-Parameter übergeben. Die Variable pagecounter sollte angeben wie oft das aktuelle Object sessionObject(d.h die aufgerufene Seite und dazugehörige Session-ID) im Array vom Typ SessionObject vorhanden ist.Wenn z.B die Seite www.bucho.de 5 Male aufgerufen wird,wird pagecounter den Wert 5 haben. Leider gibt pagecounter immer den Wert 0 (null),obwohl das Array nicht mehr leer ist . Da pagecounter immer den Wert null angibt, dann können Daten in die Datenbank nicht richtig eingetragen werden.
Die Datenbankzugriffe werden über Jdbc-Template vom Spring durchgeführt.
Hier ist mein vollständiges Code,ich bitte dich einen Blick drauf zu werfen,bei Rückfragen stehe ich immer zur Verfügung.
Im Voraus vielen Dank.
Lecorniaud.
public class SessionObject {
String page;
String sessionID;
public SessionObject(String myPage,String sessionID){
setPage(myPage);
setSessionID(sessionID);
}
public String getSessionID() {
return sessionID;
}
public void setSessionID(String sessionID) {
this.sessionID = sessionID;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
}
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerD ataSource;
public class SessionArray extends Thread{
/*aktuelle Groesse des Arrays*/
private int counter;
/*maximale Groesse des Arrays*/
private static final int MAX = 1000;
/*incrementiert sich falls eine Seite schon aufgerufen wird.*/
private int pagecounter;
/*Puffer zur Speicherung aller aufgerufene Seiten und Session_ID*/
private SessionObject[] sessionObject = new SessionObject[MAX];
protected final Log log = LogFactory.getLog(getClass());
DriverManagerDataSource dataSource ;
//jdbcTemplate fuer den Datenbankzugriff
private JdbcTemplate jdbcTemplate;
public SessionArray(int counter,int pagecounter,SessionObject[] sessionObject,DriverManagerDataSource dataSource){
this.counter = counter;
this.pagecounter = pagecounter;
this.sessionObject = sessionObject;
this.dataSource = dataSource;
}
public void run(){
try{
jdbcTemplate = new JdbcTemplate(dataSource);
String stringCounter = "";
String stringSessionCounter ="";
/*wählt in dem Puffer die letzte aufgerufene Seite,und ermittelt ob sie schon in der Tabelle existiert*/
List list = jdbcTemplate.queryForList("select page,counter,sessioncounter from statistik where page =?",new Object[] {sessionObject[counter-1].getPage()});
log.info("######## SessionArray run --> List-Size : "+list.size());
Iterator it = list.iterator();
/*Ergebnis der Datenbankabfrage.*/
while(it.hasNext()) {
Map userMap = (Map) it.next();
/*Umwandlung counter in String*/
stringCounter = userMap.get("counter").toString();
/*Umwandlung sessioncounter in String*/
stringSessionCounter =userMap.get("sessioncounter").toString();
}
int newCounter = 1;
int newSessionCounter = 1;
/*falls die aufgerufene Seite noch nicht in der Tabelle vorhanden ist,wird sie eingetragen*/
if(list.size() == 0){
jdbcTemplate.update("insert into statistik (page,counter,sessioncounter)" +
" values (?,?,?)",new Object[]{sessionObject[counter-1].getPage(),newCounter,newSessionCounter});
}else{
/*falls die Seite schon existiert,wird ein Update der Tabelle durchgeführt,was hier leider nicht funktioniert.*/
newCounter = Integer.parseInt(stringCounter)+1 ;
if(pagecounter == 0){
log.info("pagecounter: " + pagecounter);
newSessionCounter = Integer.parseInt(stringSessionCounter) + 1;
}else{
newSessionCounter = Integer.parseInt(stringSessionCounter);
}
jdbcTemplate.update("update statistik set page = ?,counter = ?," +
"sessioncounter =? where page = ?",new Object[] {sessionObject[counter-1].getPage(),newCounter,
newSessionCounter,sessionObject[counter-1].getPage()});
}
}catch(Exception e){
log.info("ERROR :" + e.getCause());
for (StackTraceElement trace : new Throwable().getStackTrace() ){
log.info("STRACK TRACE - ERROR : " + trace);
}
}
}
public void doThreadCountdown() throws java.lang.InterruptedException {
try {
Thread.sleep(2);
} catch(InterruptedException e) {
log.info("Thread interrupted!");
}
new SessionArray(counter,pagecounter,sessionObject,dat aSource).start();
}
public int getPagecounter() {
return pagecounter;
}
public void setPagecounter(int pagecounter) {
this.pagecounter = pagecounter;
}
public int getCounter() {
return counter;
}
public void setCounter(int counter) {
this.counter = counter;
}
public SessionObject[] getSessionObject() {
return sessionObject;
}
public void setSessionObject(SessionObject[] sessionObject) {
this.sessionObject = sessionObject;
}
}
package src.sessionSave;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplica tionContextUtils;
import org.springframework.jdbc.datasource.*;
public class LiveStatReceiver implements Filter{
protected final Log log = LogFactory.getLog(getClass());
protected FilterConfig config;
private int counter = 0; // Klassenvariable
private int pagecounter = 0; // Klassenvariable
/*maximale Groesse des Arrays*/
private static final int MAX = 1000;
private static SessionObject[] objectArray = new SessionObject[MAX];
String page = "";
String sessionID = "";
DriverManagerDataSource dataSource = new DriverManagerDataSource(); private SessionArray sessionArray;
public SessionArray getSessionArray(){
if (sessionArray == null){
sessionArray = new SessionArray(counter,pagecounter,objectArray,dataS ource);
}
return sessionArray;
}
public FilterConfig getConfig() {
return config;
}
public void setConfig(FilterConfig config) {
this.config = config;
}
public void init(FilterConfig config) throws ServletException{
this.config = config;
log.info("-----LiveStatReceiver : init ---> Filtername : " + config.getFilterName());
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContex t(config.getServletContext());
dataSource = (DriverManagerDataSource)ctx.getBean("myDataSource ");
}
@SuppressWarnings("static-access")
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
throws ServletException,IOException,NullPointerException{
HttpServletRequest req = (HttpServletRequest)request;
page = req.getRequestURI();
HttpSession session = req.getSession();
sessionID = (String)session.getId();
if((page != null && !page.equals("")) && (sessionID != null &&
!sessionID.equals(""))){
try{
SessionObject sessionObject = new SessionObject(page,sessionID);
if(sessionObject != null){
/*wenn counter null ist,bedeutet dass,die aufgerufene Seite noch nicht im Array angelegt ist,dann pagecounter ist auch null.*/
if(counter < 1){
pagecounter = 0;
}else{
for(int i=0; i<counter; i++){
if(objectArray[i].getPage() == page && objectArray[i].getSessionID()==sessionID){
pagecounter++; }
}
}
SessionObject newObject;
newObject = sessionObject;
objectArray[counter] = newObject;
counter++;
getSessionArray().setCounter(counter);
getSessionArray().setPagecounter(pagecounter);
getSessionArray().setSessionObject(objectArray);
}
}catch(NullPointerException e){
System.out.println("NullPointerException : "+e.getMessage());
}
}
try {
getSessionArray().doThreadCountdown();
log.info("--- Thread starten.");
}catch (InterruptedException e) {
e.printStackTrace();
for (StackTraceElement trace : new Throwable().getStackTrace() ){
log.info(" STRACK TRACE - ERROR : " + trace);
}
}
chain.doFilter(request,response);
}
public void destroy(){}
}
CREATE TABLE `statistik` (
`id` int(10) NOT NULL auto_increment,
`page` varchar(250) NOT NULL,
`counter` int(10) NOT NULL,
`sessioncounter` varchar(250) NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1;
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.co
Die Datenbankzugriffe werden über Jdbc-Template vom Spring durchgeführt.
Hier ist mein vollständiges Code,ich bitte dich einen Blick drauf zu werfen,bei Rückfragen stehe ich immer zur Verfügung.
Im Voraus vielen Dank.
Lecorniaud.
public class SessionObject {
String page;
String sessionID;
public SessionObject(String myPage,String sessionID){
setPage(myPage);
setSessionID(sessionID);
}
public String getSessionID() {
return sessionID;
}
public void setSessionID(String sessionID) {
this.sessionID = sessionID;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
}
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerD ataSource;
public class SessionArray extends Thread{
/*aktuelle Groesse des Arrays*/
private int counter;
/*maximale Groesse des Arrays*/
private static final int MAX = 1000;
/*incrementiert sich falls eine Seite schon aufgerufen wird.*/
private int pagecounter;
/*Puffer zur Speicherung aller aufgerufene Seiten und Session_ID*/
private SessionObject[] sessionObject = new SessionObject[MAX];
protected final Log log = LogFactory.getLog(getClass());
DriverManagerDataSource dataSource ;
//jdbcTemplate fuer den Datenbankzugriff
private JdbcTemplate jdbcTemplate;
public SessionArray(int counter,int pagecounter,SessionObject[] sessionObject,DriverManagerDataSource dataSource){
this.counter = counter;
this.pagecounter = pagecounter;
this.sessionObject = sessionObject;
this.dataSource = dataSource;
}
public void run(){
try{
jdbcTemplate = new JdbcTemplate(dataSource);
String stringCounter = "";
String stringSessionCounter ="";
/*wählt in dem Puffer die letzte aufgerufene Seite,und ermittelt ob sie schon in der Tabelle existiert*/
List list = jdbcTemplate.queryForList("select page,counter,sessioncounter from statistik where page =?",new Object[] {sessionObject[counter-1].getPage()});
log.info("######## SessionArray run --> List-Size : "+list.size());
Iterator it = list.iterator();
/*Ergebnis der Datenbankabfrage.*/
while(it.hasNext()) {
Map userMap = (Map) it.next();
/*Umwandlung counter in String*/
stringCounter = userMap.get("counter").toString();
/*Umwandlung sessioncounter in String*/
stringSessionCounter =userMap.get("sessioncounter").toString();
}
int newCounter = 1;
int newSessionCounter = 1;
/*falls die aufgerufene Seite noch nicht in der Tabelle vorhanden ist,wird sie eingetragen*/
if(list.size() == 0){
jdbcTemplate.update("insert into statistik (page,counter,sessioncounter)" +
" values (?,?,?)",new Object[]{sessionObject[counter-1].getPage(),newCounter,newSessionCounter});
}else{
/*falls die Seite schon existiert,wird ein Update der Tabelle durchgeführt,was hier leider nicht funktioniert.*/
newCounter = Integer.parseInt(stringCounter)+1 ;
if(pagecounter == 0){
log.info("pagecounter: " + pagecounter);
newSessionCounter = Integer.parseInt(stringSessionCounter) + 1;
}else{
newSessionCounter = Integer.parseInt(stringSessionCounter);
}
jdbcTemplate.update("update statistik set page = ?,counter = ?," +
"sessioncounter =? where page = ?",new Object[] {sessionObject[counter-1].getPage(),newCounter,
newSessionCounter,sessionObject[counter-1].getPage()});
}
}catch(Exception e){
log.info("ERROR :" + e.getCause());
for (StackTraceElement trace : new Throwable().getStackTrace() ){
log.info("STRACK TRACE - ERROR : " + trace);
}
}
}
public void doThreadCountdown() throws java.lang.InterruptedException {
try {
Thread.sleep(2);
} catch(InterruptedException e) {
log.info("Thread interrupted!");
}
new SessionArray(counter,pagecounter,sessionObject,dat aSource).start();
}
public int getPagecounter() {
return pagecounter;
}
public void setPagecounter(int pagecounter) {
this.pagecounter = pagecounter;
}
public int getCounter() {
return counter;
}
public void setCounter(int counter) {
this.counter = counter;
}
public SessionObject[] getSessionObject() {
return sessionObject;
}
public void setSessionObject(SessionObject[] sessionObject) {
this.sessionObject = sessionObject;
}
}
package src.sessionSave;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplica tionContextUtils;
import org.springframework.jdbc.datasource.*;
public class LiveStatReceiver implements Filter{
protected final Log log = LogFactory.getLog(getClass());
protected FilterConfig config;
private int counter = 0; // Klassenvariable
private int pagecounter = 0; // Klassenvariable
/*maximale Groesse des Arrays*/
private static final int MAX = 1000;
private static SessionObject[] objectArray = new SessionObject[MAX];
String page = "";
String sessionID = "";
DriverManagerDataSource dataSource = new DriverManagerDataSource(); private SessionArray sessionArray;
public SessionArray getSessionArray(){
if (sessionArray == null){
sessionArray = new SessionArray(counter,pagecounter,objectArray,dataS ource);
}
return sessionArray;
}
public FilterConfig getConfig() {
return config;
}
public void setConfig(FilterConfig config) {
this.config = config;
}
public void init(FilterConfig config) throws ServletException{
this.config = config;
log.info("-----LiveStatReceiver : init ---> Filtername : " + config.getFilterName());
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContex t(config.getServletContext());
dataSource = (DriverManagerDataSource)ctx.getBean("myDataSource ");
}
@SuppressWarnings("static-access")
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
throws ServletException,IOException,NullPointerException{
HttpServletRequest req = (HttpServletRequest)request;
page = req.getRequestURI();
HttpSession session = req.getSession();
sessionID = (String)session.getId();
if((page != null && !page.equals("")) && (sessionID != null &&
!sessionID.equals(""))){
try{
SessionObject sessionObject = new SessionObject(page,sessionID);
if(sessionObject != null){
/*wenn counter null ist,bedeutet dass,die aufgerufene Seite noch nicht im Array angelegt ist,dann pagecounter ist auch null.*/
if(counter < 1){
pagecounter = 0;
}else{
for(int i=0; i<counter; i++){
if(objectArray[i].getPage() == page && objectArray[i].getSessionID()==sessionID){
pagecounter++; }
}
}
SessionObject newObject;
newObject = sessionObject;
objectArray[counter] = newObject;
counter++;
getSessionArray().setCounter(counter);
getSessionArray().setPagecounter(pagecounter);
getSessionArray().setSessionObject(objectArray);
}
}catch(NullPointerException e){
System.out.println("NullPointerException : "+e.getMessage());
}
}
try {
getSessionArray().doThreadCountdown();
log.info("--- Thread starten.");
}catch (InterruptedException e) {
e.printStackTrace();
for (StackTraceElement trace : new Throwable().getStackTrace() ){
log.info(" STRACK TRACE - ERROR : " + trace);
}
}
chain.doFilter(request,response);
}
public void destroy(){}
}
CREATE TABLE `statistik` (
`id` int(10) NOT NULL auto_increment,
`page` varchar(250) NOT NULL,
`counter` int(10) NOT NULL,
`sessioncounter` varchar(250) NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1;
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.co
Comment