spring+hibernate做查询时多次调用提示地址被占用的错误是什么原因?
丞相 2005-10-10 01:43:14 我采用了spring+hibernate进行数据查询时,如果让连接多次查询(几千次),就报以下错误
org.springframework.jdbc.UncategorizedSQLException: (Hibernate operation): encountered SQLException [Network error IOException: Address already in use: connect]; nested exception is java.sql.SQLException: Network error IOException: Address already in use: connect
java.sql.SQLException: Network error IOException: Address already in use: connect
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:372)
at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:183)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:156)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:144)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:132)
at org.springframework.orm.hibernate.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:59)
at net.sf.hibernate.impl.BatcherImpl.openConnection(BatcherImpl.java:278)
at net.sf.hibernate.impl.SessionImpl.connect(SessionImpl.java:3264)
at net.sf.hibernate.impl.SessionImpl.connection(SessionImpl.java:3244)
at net.sf.hibernate.impl.BatcherImpl.prepareQueryStatement(BatcherImpl.java:65)
at net.sf.hibernate.loader.Loader.prepareQueryStatement(Loader.java:704)
at net.sf.hibernate.loader.Loader.doQuery(Loader.java:185)
at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:133)
at net.sf.hibernate.loader.Loader.doList(Loader.java:950)
at net.sf.hibernate.loader.Loader.list(Loader.java:941)
at net.sf.hibernate.hql.QueryTranslator.list(QueryTranslator.java:834)
at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1512)
at net.sf.hibernate.impl.QueryImpl.list(QueryImpl.java:39)
at org.springframework.orm.hibernate.HibernateTemplate$23.doInHibernate
HibernateTemplate.java:501)
at org.springframework.orm.hibernate.HibernateTemplate.execute
HibernateTemplate.java:243)
at org.springframework.orm.hibernate.HibernateTemplate.executeFind(HibernateTemplate.java:263)
at org.springframework.orm.hibernate.HibernateTemplate.find(HibernateTemplate.java:498)
at com.gbc.stgp.dao.hibernate.ChannelInfoDAOHibernate.getChannelInfos(ChannelInfoDAOHibernate.java:90)
at com.gbc.stgp.dao.hibernate.ChannelInfoDAOHibernate.getChannelFolderInfos(ChannelInfoDAOHibernate.java:98)
at com.gbc.stgp.service.impl.ChannelInfoManagerImpl.getChannelFolderInfos(ChannelInfoManagerImpl.java:111)
at _test__jsp._jspService(_test__jsp.java:32)
at com.caucho.jsp.JavaPage.service(JavaPage.java:75)
at com.caucho.jsp.Page.subservice(Page.java:506)
at com.caucho.server.http.FilterChainPage.doFilter(FilterChainPage.java:182)
at com.caucho.server.http.Invocation.service(Invocation.java:315)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:246)
at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:163)
at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
at java.lang.Thread.run(Thread.java:534)
Caused by: java.net.BindException: Address already in use: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
at java.net.Socket.connect(Socket.java:452)
at sun.reflect.GeneratedMethodAccessor31.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at net.sourceforge.jtds.jdbc.SharedSocket.<init>(SharedSocket.java:274)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:301)
... 37 more
我用测试程序连接调用的方法代码是
public int channelResInfoNums(String channelid) {
int totalCount = 0;
Query query = null;
String sql = null;
Session s = this.getSession();
try {
sql = "SELECT count(a.id) FROM UserInfo AS a WHERE a.code='101'";
query = getHibernateTemplate().createQuery(s, sql);
totalCount = ( (Integer) query.iterate().next()).intValue();
}
catch (Exception ex) {
totalCount=0;
}
finally {
closeSessionIfNecessary(s);
}
return totalCount;
}