[ Cyberghost @ 22.06.2008. 10:13 ] @
Za testiranje web aplikacije koristim Tomcat 6.0.10. Kada iz Eclipse uradim deploy aplikacije,
sve lepo radi nekoliko sati. Nakon toga (duze vreme ne koriscenja) jednostavno mogu
samo da uradimpovezivanje na prvu stranu aplikacije gde se vrsi logovanje, ali ne postoji
sansa da s eulogujem sa korisnickim imenom i sifrom (baza mySQL 5.0).
Moj zakljucak je da je veza izmedju mySQL-a i Tomacata problem, posto mi se
prikaze prva strana aplikacije, a cim pokusam komunikaciju sa bazom nastaje problem.
Kada uradim reststart Tomcat-a sve radi kao podmazano !
Tomacat je instaliran kao Windows service. Da li je bolje da koristim
preconfigured verziju i da se manuelno pokrece ???

Evo ERROR-a

Code:

java.sql.SQLException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:


** BEGIN NESTED EXCEPTION ** 

com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Software caused connection abort: recv failed

STACKTRACE:

java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:105)
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:148)
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:176)
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1899)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2348)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2858)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1570)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:2972)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:2902)
    at com.mysql.jdbc.Statement.executeQuery(Statement.java:822)
    at command.SearchingAdmin.findByUNAndPass(Unknown Source)
    at controller.CheckAdmin.doGet(Unknown Source)
    at controller.CheckAdmin.doPost(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:866)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:716)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1498)
    at java.lang.Thread.run(Unknown Source)


** END NESTED EXCEPTION **



Last packet sent to the server was 31 ms ago.

STACKTRACE:

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Software caused connection abort: recv failed

STACKTRACE:

java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:105)
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:148)
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:176)
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1899)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2348)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2858)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1570)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:2972)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:2902)
    at com.mysql.jdbc.Statement.executeQuery(Statement.java:822)
    at command.SearchingAdmin.findByUNAndPass(Unknown Source)
    at controller.CheckAdmin.doGet(Unknown Source)
    at controller.CheckAdmin.doPost(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:866)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:716)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1498)
    at java.lang.Thread.run(Unknown Source)

[ anon315 @ 22.06.2008. 11:17 ] @
Kako menadzujes konekciju ka bazi?
[ Cyberghost @ 22.06.2008. 11:25 ] @
Evo Coonectgion properties-a i Connection class-e

Code:

driver=com.mysql.jdbc.Driver
jdbcURL=jdbc:mysql://localhost:3306/logmein
username=root
password=nekipass
preconnectCount=10
maxIdleConnections=15
maxConnections=20



Code:

package pool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

public class ConnectionPool {

  /** Vraca jedinu (singleton) instancu poola. */
  public static ConnectionPool getInstance() {
    return instance;
  }

  /** Uzima jednu konekciju iz poola. */
  public synchronized Connection checkOut() throws SQLException {
    Connection conn = null;
    if (freeConnections.size() > 0) {
      conn = (Connection)freeConnections.get(0);
      freeConnections.remove(0);
      usedConnections.add(conn);
    } else {
      if (connectCount < maxConnections) {
        conn = DriverManager.getConnection(
          jdbcURL, username, password);
        usedConnections.add(conn);
        connectCount++;
      } else {
        try {
          wait();
          conn = (Connection)freeConnections.get(0);
          freeConnections.remove(0);
          usedConnections.add(conn);
        } catch (InterruptedException ex) {
          ex.printStackTrace();
        }
      }
    }
    return conn;
  }

  /** vraca konekciju u pool. */
  public synchronized void checkIn(Connection aConn) {
    if (aConn ==  null)
      return;
    if (usedConnections.remove(aConn)) {
      freeConnections.add(aConn);
      while (freeConnections.size() > maxIdleConnections) {
        int lastOne = freeConnections.size() - 1;
        Connection conn = (Connection)
          freeConnections.get(lastOne);
        try { conn.close(); } catch (SQLException ex) { }
        freeConnections.remove(lastOne);
      }
      notify();
    }
  }

  /** konstruise pool. */
  protected ConnectionPool(String driver, String jdbcURL, String username,
      String password, int preconnectCount, int maxIdleConnections,
      int maxConnections) throws ClassNotFoundException, SQLException {

    freeConnections = new ArrayList();
    usedConnections = new ArrayList();
    this.driver = driver;
    this.jdbcURL = jdbcURL;
    this.username = username;
    this.password = password;
    this.preconnectCount = preconnectCount;
    this.maxIdleConnections = maxIdleConnections;
    this.maxConnections = maxConnections;

    Class.forName(driver);
    for (int i = 0; i < preconnectCount; i++) {
      Connection conn = DriverManager.getConnection(
        jdbcURL, username, password);
      conn.setAutoCommit(false);
      freeConnections.add(conn);
    }
    connectCount = preconnectCount;
  }

  private static ConnectionPool instance;
  private String driver;
  private String jdbcURL;
  private String username;
  private String password;
  private int preconnectCount;
  private int connectCount;
  private int maxIdleConnections;
  private int maxConnections;
  private List usedConnections;
  private List freeConnections;

  static {
    ResourceBundle bundle =
      PropertyResourceBundle.getBundle("pool.ConnectionPool");
    String driver = bundle.getString("driver");
    String jdbcURL = bundle.getString("jdbcURL");
    String username = bundle.getString("username");
    String password = bundle.getString("password");
    int preconnectCount = 0;
    int maxIdleConnections = 10;
    int maxConnections = 10;
    try {
      preconnectCount = Integer.parseInt(
        bundle.getString("preconnectCount"));
      maxIdleConnections = Integer.parseInt(
        bundle.getString("maxIdleConnections"));
      maxConnections = Integer.parseInt(
        bundle.getString("maxConnections"));
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    try {
      instance = new ConnectionPool(driver,
        jdbcURL, username, password,
        preconnectCount, maxIdleConnections,
        maxConnections);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }



Web aplikacijama sam poceo da se bavim aktivno tek nedavno (mesec dana).
Pozajmio sam deo koda za Deploy aplikacije radi lakseg testiranja i klasu za Konekciju na bazu,
ostalo sam sam pravio.
[ anon315 @ 22.06.2008. 15:59 ] @
Pogledaj ovo: http://commons.apache.org/dbcp/

A ako ti nije bitno da aplikaciju mozes da startujes i kao standalone (od servisa pa na nize), onda mozes da ides i preko JNDI datasource-a: http://tomcat.apache.org/tomca...datasource-examples-howto.html
[ Cyberghost @ 22.06.2008. 16:23 ] @
Citat:
Vanja Petreski: Pogledaj ovo: http://commons.apache.org/dbcp/ ;)

A ako ti nije bitno da aplikaciju mozes da startujes i kao standalone (od servisa pa na nize), onda mozes da ides i preko JNDI datasource-a: http://tomcat.apache.org/tomca...datasource-examples-howto.html


Auuuuuuuuu ovo je dobro, jako korisno.
Taman sam se zabrinuo da nema resenja i da moram da menjam web "kantu" ! ;)
Trenutno se stanje malo stabilizovalo.
Pokrenuo sam Tomcat preconfigured verziju 5.0.28 i zaobisao winodws service,
evo vec 5-6h radi normalno.

Hvala na savetu.
[ Cyberghost @ 23.06.2008. 17:25 ] @
Ponovo je poceo da se desava isti problem.
Pronasao sam uzrok na mySQL forumu gde je opisano da problem
nastaje kada se nakon zavrsetka komunikacije sa bazom ne uradi
odmah zatvaranje konekcije.
Sve sam 2 puta proverio, u svim klasama nakon vracanja rezultata upita vrsim zatvaranje
konekcije, i opet je isti problem, posle nekoliko sati u idle rezimu mySQL se zaglupi
i ne mogu se povezati na njega.
Mnogi imaju problem sa ovim i pokusano je na razne nacine konfigurisanjem my.cfg fajl za mySQL
ali meni i dalje ne ide.
Pominje se postavljanje autoReconnect = true // ali opet se napominje da to nije dobro
Pise i da mySQL nakon 8h neaktivnosti zatvara konekciju ...
Sve me ovo zbunjuje i jednostavno aplikacija posle nekoliko sati ne radi, pre 2 godine
sam imao problem kada sam otisao na ispit i hteo da pokazem aplikaciju koja je radila
kod kuce na racunaru nismo mogli da se ulogujemo, sad se ispostavilo da je i tada bio isti
problem !

Da li da menjam ovaj mySQL, dajte neki predlog !!!

Glavni problem je ovo:
Communications link failure due to underlying exception
[ anon315 @ 23.06.2008. 19:10 ] @
Pa dao sam ti savet

Imao sam, cini mi se, slican problem kada sam koristio dbcp, a ovakvo podesavanje parametara mi je zavrsilo posao (copy/paste-ovao sam iz Spring contexta..):

Code:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${db.driver}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.user}"/>
        <property name="password" value="${db.pass}"/>
        <property name="initialSize" value="5" />
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="10" />
        <!-- Na svakih sat cisti idle kandidate -->
        <property name="timeBetweenEvictionRunsMillis" value="3600000" />     
        <!-- Ovo su defaulti
         U jednom prolazu eviction threada maksimum 3 proveri
        <property name="numTestsPerEvictionRun" value="3" />  
         Da bi konekcija u pool-u bila kandidat za eviction, mora da je idle bar 30 minuta
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        -->


Da stavis dbcp i pretumbas kod ti je 5 minuta..
[ Cyberghost @ 24.06.2008. 15:55 ] @
E evo skinuo sam dbcp postavio ga kako kaze uputstvo i napravio context.xml u okviru aplikacije,
veceras cemo da vidimo da li ce da radi !!!!

dbcp.jar sam smestio u TOMCAT/common/lib ovo Boldirano sam moram da napravim !
U uputstvu kaze da Tomcat jedino iz tog direktorijuma tj. $CATALINA_HOME/common/lib hoce
da ucita biblioteke !!!
[ Dejan Lozanovic @ 25.06.2008. 15:35 ] @
e a drugo pitanje kako koristis konekciju s bazom, jel koristis JDBC ili jos nesto pored, ako se zezas sa cistim JDBC-om onda imaj na umu da svaki PreparedStatement i resultSet isto tako moras da zatvaras nakon upotrebe.
[ Cyberghost @ 25.06.2008. 17:54 ] @
Citat:
Dejan Lozanovic: e a drugo pitanje kako koristis konekciju s bazom, jel koristis JDBC ili jos nesto pored, ako se zezas sa cistim JDBC-om onda imaj na umu da svaki PreparedStatement i resultSet isto tako moras da zatvaras nakon upotrebe.


Koristim JDBC driver. Konekcije se "uzimaju " i "vracaju" u ConnectionPool.
Nekim cudom statement i resultSet nisu zatvoreni nakon upotrebe ali jeste zatvorena konekcija ka bazi, tj
vracena je konekcija u pool cime se izvrsilo zatvaranje konekcije.
Pronasao sam kompletan tutorial za ovaj DBCP na
http://tomcat.apache.org/tomca...datasource-examples-howto.html
pa cu jos jednom od pocetka sve da probam ako to ne prodje ne znam sta da radim.
Ucim Struts trenutno pa cu probati kasnije i sa Vanjinim primerom Context-a.
[ anon315 @ 25.06.2008. 19:28 ] @
Context ti je iz Springa, ali nije bila poenta da ti skrenem paznju na to, nego na parametre DBCP-a. Ne moras da koristis Spring za to..

Btw, ako ucis Struts, nadam se da ucis Struts2 ;)
[ Cyberghost @ 26.06.2008. 09:09 ] @
Citat:
Vanja Petreski: Context ti je iz Springa, ali nije bila poenta da ti skrenem paznju na to, nego na parametre DBCP-a. Ne moras da koristis Spring za to..

Btw, ako ucis Struts, nadam se da ucis Struts2 ;)


Da poceo sam Struts da citam e onda sam primetio da je izasla Verzija 2, i kada sam nju poceo da citam
konkretno Practical Apache Struts 2 Web 2.0 Projects poceli su sa Mavenom i Ajax-om
i nisam mogao da se sastavim, pa sad jurim nesto jednostavnije, kao sto je Struts 1
from Beginning to Professional ali ta knjiga je za Struts 1 !!!

Ima li neki predlog za pocetak u Struts 2 ?
Nasao sam:

- Struts 2 in Action (In Action)
- Struts: The Complete Reference, 2nd Edition
- sve ostale su Pro varijante
[ anon315 @ 26.06.2008. 18:00 ] @
Manning - Struts 2 in Action 2008 je odlicna knjiga, ja sam je bas skoro procitao i bas sam zadovoljan. Doduse i sajt je neophodan, jer se S2 brzo razvija..