Newsgroup: it.comp.java
Titolo: iBatis: "too many connections"

Ciao,
è la prima volta che utilizzo il framework Ibatis per un progetto web.
E' stato utilizzato Struts per la parte presentation, come database
MySQL 5.0, TomCat 5.5 come application server e per la persistenza
dati appunto Ibatis.
Ho configurato il file SqlMapConfig.xml nel seguente modo:
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="${driver}"/>
			<property name="JDBC.ConnectionURL" value="${url}"/>
			<property name="JDBC.Username" value="${username}"/>
			<property name="JDBC.Password" value="${password}"/>
                        <property name="Pool.MaximumActiveConnections"
value="10"/>
                        <property name="Pool.MaximumIdleConnections"
value="5"/>
                         <property name="Pool.MaximumCheckoutTime"
value="120000"/>
		</dataSource>
dopo un tot di interrogazioni al DB viene lanciato il seguente errore:
Caused by:
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Data
source rejected establishment of connection,  message from server:
"Too many connections"
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:921)
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:997)
	at com.mysql.jdbc.Connection.createNewIO(Connection.java:2670)
	at com.mysql.jdbc.Connection.<init>(Connection.java:1531)
	at
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:
266)
	at java.sql.DriverManager.getConnection(DriverManager.java:525)
	at java.sql.DriverManager.getConnection(DriverManager.java:171)
	at
com.ibatis.common.jdbc.SimpleDataSource.popConnection(SimpleDataSource.java:
571)
	at
com.ibatis.common.jdbc.SimpleDataSource.getConnection(SimpleDataSource.java:
213)
	at
com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransaction.init(JdbcTransaction.java:
48)
	at
com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransaction.getConnection(JdbcTransaction.java:
89)
	at
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:
104)
	at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:
561)
	at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:
536)
	at
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:
93)
	at
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:
70)
	at
com.ibatis.dao.client.template.SqlMapDaoTemplate.queryForObject(SqlMapDaoTemplate.java:
162)
	at
it.techwatch.etc.dao.implementation.EtcDaoImpl.getNrCards(EtcDaoImpl.java:
17)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at com.ibatis.dao.engine.impl.DaoProxy.invoke(DaoProxy.java:72)
	at $Proxy1.getNrCards(Unknown Source)
	at it.techwatch.etc.business.HomeBean.popolateValue(HomeBean.java:98)
	at it.techwatch.etc.business.HomeBean.<init>(HomeBean.java:75)
	at org.apache.jsp.jsp.priv.home.home_jsp._jspService(home_jsp.java:
166)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:
334)
	at
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:
314)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
252)
	at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
173)
	at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
213)
	at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
178)
	at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
126)
	at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
105)
	at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
107)
	at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
148)
	at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
869)
	at org.apache.coyote.http11.Http11BaseProtocol
$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:
664)
	at
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:
527)
	at
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:
80)
	at org.apache.tomcat.util.threads.ThreadPool
$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Thread.java:595)
Penso che il problema sia dovuto al fatto che ogni volta che interrogo
il DB iBatis crea una connessione, quello che desidero io che utilizzi
sempre la stessa connessione per tutte le chiamate al DB.
Come posso risolve il problema?
Grazie anticipatamente.

usa un connection pool, per esempio apache commons dbcp
basta che lo configuri come datasource (quindi non il simple)
mi sembra che sul manuale di ibatis ci sia l'esempio, sennņ fammi sapere ora 
non l'ho qui a disposizione
ciao

 ciao
Ho utilizzato come Transaction Manager il tipo "JDBC" e come tipo di
implementazione come DataSourceFactory il tipo "DBCP" ovvero Jakarta
Commons Connection Pool utilizzando
                           commons-dbcp-1.2.1.zip
                           commons-pool-1.3.zip
                           commons-collections-3.2.zip
Nel file di configurazione SqlMapConfing.xml ho inserito:
	<transactionManager type="JDBC">
		<dataSource type="DBCP" >
			<property name="driverClassName" value="${driver}"/>
			<property name="url" value="${url}"/>
			<property name="username" value="${username}"/>
			<property name="password" value="${password}"/>
			<property name="maxActive" value="30"/>
			<property name="maxIdle" value="10"/>
			<property name="maxWait" value="60000"/>
		</dataSource>
	</transactionManager>
Guardando il file di log risulta che viene creato una connessione ad
ogni chiamata al DB e subito dopo una
restituzione della connessione al pool.
DEBUG com.ibatis.common.jdbc.SimpleDataSource - Created connection
6232809.

 ciao
L'ho già fatto con lo stesso risultato.
Ho utilizzato come Transaction Manager il tipo "JDBC" e come tipo di
implementazione come DataSourceFactory il tipo "DBCP" ovvero Jakarta
Commons Connection Pool utilizzando
                           commons-dbcp-1.2.1.zip
                           commons-pool-1.3.zip
                           commons-collections-3.2.zip
Nel file di configurazione SqlMapConfing.xml ho inserito:
	<transactionManager type="JDBC">
		<dataSource type="DBCP" >
			<property name="driverClassName" value="${driver}"/>
			<property name="url" value="${url}"/>
			<property name="username" value="${username}"/>
			<property name="password" value="${password}"/>
			<property name="maxActive" value="30"/>
			<property name="maxIdle" value="10"/>
			<property name="maxWait" value="60000"/>
		</dataSource>
	</transactionManager>
Guardando il file di log l'errore l'anciato è
org.apache.commons.dbcp.SQLNestedException: Cannot create
PoolableConnectionFactory (Data source rejected establishment of
connection,  message from server: "Too many connections")
A questo punto non so se è una incompatibilità tra DBCP e il connector
di MySql (mysql-connector-java-5.0.4.zip)
Non so cosa pensare !!!

 ciao
L'ho già fatto con lo stesso risultato.
