PDA

View Full Version : [JAVA+JPA] Problema con i thread


qwerty86
22-09-2013, 16:09
Salve a tutti,

Classe Server
public class Server extends Thread
{
private ServerSocket Server;

public Server() throws Exception
{
Server = new ServerSocket(7004);
System.out.println("Il Server è in attesa sulla porta 7004.");
this.start();
}

public void run()
{
while(true)
{
try {
System.out.println("In attesa di Connessione.");
Socket client = Server.accept();
System.out.println("Connessione accettata da: "+
client.getInetAddress());

Thread t = new Thread(new RequestManager(client));
t.start();
}
catch(Exception e) {}
}
}

public static void main(String argv[]) throws Exception
{
//Used for log4j properties
System.setProperty("log.name","server");
new Server();
}
}

Classe RequestManager
class RequestManager implements Runnable
{
final Logger logger = LoggerFactory.getLogger(RequestManager.class.getCanonicalName());

final static String IMEI = "IMEI";
final static String DATA = "DATA";
final static String TIME = "TIME";
final static String QUIT = "QUIT";

private Socket client = null;
BufferedReader in = null;
PrintStream out = null;

private EntityManager entityManager;

public RequestManager() {}
public RequestManager(Socket clientSocket)
{
client = clientSocket;
try
{
in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
out = new PrintStream(client.getOutputStream(), true);

entityManager = Persistence.createEntityManagerFactory("SensorPersistence").createEntityManager();
}
catch(Exception e1)
{
try { client.close(); }
catch(Exception e) { System.out.println(e.getMessage());}
return;
}
//this.start();
}
public void run()
{
MeasurementsManager mm = new MeasurementsManager(entityManager);


Measurement meas = new Measurement();
//setto i vari valori
mm.add(meas);
}


Classe MeasurementsManager

public class MeasurementsManager implements Manager<Measurement>
{

private EntityManager em;

public MeasurementsManager() {


}
public MeasurementsManager(EntityManager em) {
//super();
this.em = em;

}

@Override
public boolean add(Measurement entity) {

//EntityManager em = Persistence.createEntityManagerFactory("SensorPersistence").createEntityManager();
try {
EntityTransaction t = em.getTransaction();
try {
t.begin();

em.persist(entity);

t.commit();
} finally {
if (t.isActive()) t.rollback();
}
} finally {
//em.close();
}
return true;

}

@Override
public boolean delete(Measurement entity) {
em.getTransaction().begin();

Query query = em.createQuery(
"DELETE FROM Student s WHERE s.id = ?1");
int deletedCount = query.setParameter(1, entity.getMeaId()).executeUpdate();

em.getTransaction().commit();
return deletedCount > 0;
}

@Override
public List<Measurement> getAll() {
TypedQuery<Measurement> query = em.createNamedQuery("Measurement.findAll", Measurement.class);
return query.getResultList();
}



}


Il tutto funziona, riuscendo a memorizzare i dati nel DB, il problema è che se eseguo 10 thread (client) che inviano i dati, nel db restano attive le connessioni. Questo comporta che dopo un po' le connessioni al db raggiungono il limite. Le connessioni vengono chiuse correttamente solo se termino il thread principale e cioè Server. Qualcuno sa aiutarmi? Grazie.

ndakota
22-09-2013, 18:04
Di close() sull'EntityManager non ne fai? Ne vedo solo una commentata.

qwerty86
23-09-2013, 09:06
Di close() sull'EntityManager non ne fai? Ne vedo solo una commentata.

Si scusa, la faccio nel metodo run, dopo aver fatto tutte le operazioni. Ma nulla!

qwerty86
23-09-2013, 21:25
Grazie all'aiuto dell'utente mone.java ho risolto. Il problema era che non invocavo la colse sul'Entity Manager Factory.

ndakota
23-09-2013, 23:16
Già, volevo dirtelo anche io :D