Sziasztok!
Szeretnék segítséget kérni egy mysql-hibernate c3p0 pooling beállításához mivel valamiért mindig elfogynak a kapcsolatok... ez egy GWT alapú webapp viszont van benne egy print thread és ebben a threadben fogy el valamiért a szabad kapcsolatok száma.
A print thread nagyon egyszerű: elindul a szál, megnézi egy List-ben hogy van-e nyomtatandó blokk, ha igen akkor kinyomtat 6 darabot, ha ezzel megvan akkor csinál egy másik szálat és ő elmegy 1 percre aludni. A másik szál csak annyit csinál hogy interneten egy json rest apit meghív ha kap vissza adatot akkor feldolgozza és a nyomtatandó blokkot berakja a print thread-be(statikus metodussal...)
A print threadben így inditom el a másik szálat:
new Thread(new Runnable() { @Override public void run() { logger.trace("START PRINT THREAD => getNewDatasAndPrint() THREAD"); EntityManager entityManager = createEntityManager(); try { entityManager.getTransaction().begin(); bkp_POSPrintService.getNewDatasAndPrint(entityManager); entityManager.getTransaction().commit(); entityManager.close(); logger.trace("END PRINT THREAD => getNewDatasAndPrint() THREAD"); } catch (Exception ex) { if (entityManager.getTransaction().isActive()) { entityManager.getTransaction().rollback(); } entityManager.close(); logger.warn("PRINT THREAD EXCEPTION2: " + ex.getMessage()); } } }).start();
az entity managert így hozom létre:
public static EntityManager createEntityManager() { EntityManagerFactory createEntityManagerFactory = Persistence.createEntityManagerFactory(entityManagerUnitName); return createEntityManagerFactory.createEntityManager(); }
persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="etelkiszallitoszamlazo"> <class>......</class> <properties> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.current_session_context_class" value="thread" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.connection.CharSet" value="utf8" /> <property name="hibernate.connection.characterEncoding" value="utf8" /> <property name="hibernate.connection.useUnicode" value="true" /> <property name="hibernate.archive.autodetection" value="class, hbm" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> <property name="hibernate.connection.password" value="" /> <property name="hibernate.connection.url" value="jdbc:mysql://localhost/DBNEV" /> <property name="hibernate.connection.username" value="root" /> <property name="hibernate.dialect" value="hgexengine.utils.server.hibernate.Mysql5BitBooleanDialect" /> <property name="hibernate.c3p0.min_size" value="1" /> <!-- 5 --> <property name="hibernate.c3p0.max_size" value="4" /> <!-- 20 --> <property name="hibernate.c3p0.timeout" value="1200" /> <!-- 1800 --> <property name="hibernate.c3p0.max_statements" value="15" /> <!-- 50 --> <property name="hibernate.c3p0.idle_test_period" value="300" /> </properties> </persistence-unit> </persistence>
mysql-nel a mysql-huge config fájlt használom...
és ezt az exceptiont kapom:
2013-03-25/13:32:29.937/CET [Thread-479] TRACE (hu.eggproject.etelkiszallito.szamlazo.server.servlet.PrintThread:103) - run - END PRINT THREAD => getNewDatasAndPrint() THREAD
2013-03-25/13:32:56.343/CET [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] WARN (com.mchange.v2.resourcepool.BasicResourcePool:1841) - run - com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@114344a -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
at sun.reflect.GeneratedConstructorAccessor193.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1102)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2142)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:773)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
at sun.reflect.GeneratedConstructorAccessor62.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:352)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
valaki valami tipp hogy mit rontok el ?
3 Comments
Anonymous
Lehet, hogy rossz irányba indulok, de maga MySQL beállításaiban nincs valami ami agyonvágja ezt?
Harangozo Gabor
nem akarom most ide bemásolni mert baromi nagy, de ahogy irtam az alap my-huge.ini -vel fut a mysql...
amikor leáll az a szál ami a távoli restet hívja akkor directben meg kéne mondani a c3p0-nak hogy az ott fent tartott szálakat dobja el mert szerint azzal van a probléma hogy 1 percenként feléled a szál ... most az időzítéssekkel probálkozom a c3p0 beállításánál az xmlben...
Auth Gábor
Nem lehet, hogy a 4, mint maximális méret, kicsit kevés? Hmm... MySQL exception, akkor nem... a SHOW PROCESSLIST mit mond?