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.
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.