随笔-42  评论-349  文章-4  trackbacks-0

(原创,残梦追月转载请注明!)    
原来在我的csdn上,转帖过来。

    使用jdbc连接数据库所有功能都没问题,发布到tomcat中也没问题,可是如果使用tomcat的数据源,来连接数据库,开始很正常,但是刷新几次就会出现这个异常……

  

         2008-04-26 22:35:40,812 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: null

 2008-04-26 22:35:40,812 ERROR [org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error Timeout waiting for idle object

 2008-04-26 22:35:40,812 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: null

 2008-04-26 22:35:40,812 ERROR [org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error Timeout waiting for idle object

 2008-04-26 22:35:40,812 ERROR [com.dao.MessageDAO] - find all failed

 org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; Cannot get a connection, pool error Timeout waiting for idle object; nested exception is org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

Caused by:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

    at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:104)

    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880) 

    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)

……………………


开始弄了半天也不知道怎么回事,后来发现是我自己写的分页代码有问题……原来的代码如下:


 1    /**
 2      * 自定义的,用属性模糊查询
 3      *
 4      * */
 5     public List find(String propertyName, Object value) {
 6 
 7         log.debug("finding Message instance with property: " + propertyName
 8 
 9               + ", value: " + value);
10 
11         try {
12 
13            String queryString = "from Message as model where model."
14 
15                                    + propertyName + " like "+value+" order by model.time desc";          
16 
17            return getHibernateTemplate().find(queryString);
18 
19         } catch (RuntimeException re) {
20 
21            log.error("find by property name failed", re);
22 
23            throw re;
24 
25         }
26 
27       }
28 
29 
30     /**
31      *
32      * 自定义的方法,获取指定页的数据
33      *
34      * */
35     public List gotoPage(int page,int pageSize){
36 
37        
38 
39         int totItem = this.findAll().size();//记录总条数
40 
41         int pageNum = totItem / pageSize +1;//总页数
42 
43         int begin = 0;//当前起始记录数
44 
45        
46         begin=page*pageSize-pageSize+1//计算当前起始位置
47 
48 
49         Session s =this.getSession();
50 
51         String hql = "from Message message order by message.time desc";
52 
53         Query q =s.createQuery(hql);
54 
55         q.setFirstResult(begin);
56 
57         q.setMaxResults(pageSize);      
58 
59         return q.list();
60 
61     }

在这句中:
                Session s =this.getSession();

        String hql = "from Message message order by message.time desc";

        Query q =s.createQuery(hql);

   查询数据时,Spring并不能够自动管理连接,也就是说,在使用中这几句代码重视不段的获取数据库的连接,每调用一次就申请一个连接……直到 tomcat连接池中的连接耗尽……所以就再也申请不到连接了……出现了这个异常,解决办法是使用事务来管理这段代码,让Spring自动管理这段代码中申请的连接。我使用了Spring AOP自动事务代理……配置文件如下……


 1     <bean id="JndiDataSource"
 2         class="org.springframework.jndi.JndiObjectFactoryBean">
 3         <property name="jndiName">
 4             <value>java:comp/env/SqlServer</value>
 5         </property>
 6         <property name="resourceRef">
 7             <value>true</value>
 8         </property>
 9     </bean>
10 
11     <!-- hibernate的会话工厂 -->
12     <bean id="sessionFactory"
13         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
14         <property name="dataSource">
15             <ref bean="JndiDataSource"></ref>
16         </property>
17         <property name="hibernateProperties">
18             <props>
19                 <prop key="hibernate.dialect">
20                     org.hibernate.dialect.SQLServerDialect
21                 </prop>
22                 <!-- 显示SQL,为了方便测试 -->
23                 <prop key="hibernate.show_sql">true</prop>
24             </props>
25         </property>
26         <property name="mappingResources">
27             <list><!-- 映射文件 -->
28                 <value>./Message.hbm.xml</value>
29                 <value>./Setting.hbm.xml</value>
30                 <value>./Admin.hbm.xml</value>
31             </list>
32         </property>
33     </bean>
34 
35     <!-- 事务管理器 -->
36     <bean id="transactionManger"
37         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
38         <property name="sessionFactory">
39             <ref bean="sessionFactory" />
40         </property>
41     </bean>
42 
43     <!--   配置事务拦截器-->
44 
45     <bean id="transactionInterceptor"
46         class="org.springframework.transaction.interceptor.TransactionInterceptor">
47         <property name="transactionManager">
48             <ref bean="transactionManger" />
49         </property>
50         <!--   下面定义事务传播属性-->
51         <property name="transactionAttributes">
52             <props>
53                 <prop key="find*">PROPAGATION_REQUIRED</prop>
54                 <prop key="delete*">PROPAGATION_REQUIRED</prop>
55                 <prop key="save*">PROPAGATION_REQUIRED</prop>
56                 <prop key="merge*">PROPAGATION_REQUIRED</prop>
57                 <prop key="attach*">PROPAGATION_REQUIRED</prop>           
58                 <prop key="gotoPage">PROPAGATION_REQUIRED</prop>
59             </props>
60         </property>
61     </bean>
62 
63     <!--  自动代理 -->
64     <bean id="autoBeanNameProxyCreator"
65         class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
66         <property name="beanNames">
67             <list>
68                 <value>*DAO</value>            
69                 <value>gotoPage</value>
70                 <value>find</value>
71             </list>
72         </property>
73         <property name="interceptorNames">
74             <list>
75                 <idref local="transactionInterceptor" />
76             </list>
77         </property>
78         <!--  这里的配置是必须的,否则无法完成代理的类型转化 这是使用CGLIB来生成代理 -->
79         <property name="proxyTargetClass" value="true"/>
80     </bean>
81 
82     <bean id="MessageDAO" class="com.dao.MessageDAO">
83         <property name="sessionFactory">
84             <ref bean="sessionFactory"></ref>
85         </property>
86     </bean>
87 
88     <bean id="SettingDAO" class="com.dao.SettingDAO">
89         <property name="sessionFactory">
90             <ref bean="sessionFactory"></ref>
91         </property>
92     </bean>
93 
94     <bean id="AdminDAO" class="com.dao.AdminDAO">
95         <property name="sessionFactory">
96             <ref bean="sessionFactory"></ref>
97         </property>
98     </bean>
OK,问题成功解决!速度好像还快些!

By:残梦追月
posted on 2008-07-15 17:57 残梦追月 阅读(10492) 评论(9)  编辑  收藏 所属分类: SpringhibernateTomcat

评论:
# re: 在Spring+hibernate中不能释放tomcat连接池中连接的解决办法 2008-07-15 22:12 | Robin's Java World
没有说到点子上。
真正的原因应该是没有commit,所以没有正常释放连接。  回复  更多评论
  
# re: 在Spring+hibernate中不能释放tomcat连接池中连接的解决办法 2008-07-16 01:10 | YYX
在hibernateDaoSupport的支持下,session不该这样来获得的。
最好的方法是用execute()回调,session会作为HibernateCallBack匿名内部类的doInHibernate方法的传入参数。

你如果硬要用getSession(),那么请参考execute()方法源码的写法。  回复  更多评论
  
# re: 在Spring+hibernate中不能释放tomcat连接池中连接的解决办法 2008-07-16 09:51 | 残梦追月
@YYX
谢谢!请问如果用我这样的方法的结果就是无法正常释放连接吗?用回调接口会自动释放连接?  回复  更多评论
  
# re: 在Spring+hibernate中不能释放tomcat连接池中连接的解决办法 2008-07-16 09:52 | 残梦追月
@Robin's Java World
:-),谢谢,我说了半天也没说出真正原因,只是把现象写出来老!谢谢,您才是透过现象看本质啊。  回复  更多评论
  
# re: 在Spring+hibernate中不能释放tomcat连接池中连接的解决办法 2008-10-08 16:37 | 阿什顿
我也出现这错误
commit 什么意思?
没有使用事务操作的原因不?  回复  更多评论
  
# re: 在Spring+hibernate中不能释放tomcat连接池中连接的解决办法 2008-10-15 22:13 | Bulejava
复制你的事物管理代码 还是没用,刷新到10就挂了。  回复  更多评论
  
# re: 在Spring+hibernate中不能释放tomcat连接池中连接的解决办法 2009-07-17 11:09 | 赵小明
用了你的代码,还是不管用  回复  更多评论
  
# re: 在Spring+hibernate中不能释放tomcat连接池中连接的解决办法 2011-09-30 15:53 | showzh
不管用  回复  更多评论
  
# re: 在Spring+hibernate中不能释放tomcat连接池中连接的解决办法 2011-11-08 10:22 | 贝壳里的海
学习了,今天刚好遇到这样的问题,JBoss里的配置貌似也很重要  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: