从spring 2.5的文档里直接抄下的来配置文件,来配置数据库连接池和hibernate,结果发现运行一段时间后程序就会在查询数据库的地方卡死,而且日志里并没有打印现hibenrate的sql,问题到底发生在什么地方呢?我打开jconsole,连接到程序上一看,发现好多线程被阻塞了,而且都阻塞于pool.getConnection(),看来是DBCP出了问题。后来在网上查了一会,找到hibernate邮件列表上的一段讨论,原来hibernate开发人员认为DBCP设计得不好,BUG多,文档少,所以就不再提供对DBCP的支持了,要用数据库连接池就得用c3p0。看来hibernate每次用完连接都不还给连接池的。我也不想去找如何配置C3P0了,反正生产环境用的肯定是jboss的通过JNDI取到的数据源。干脆让tomcat来管理数据库连接池吧,让spring通过jndi来找到它。在tomcat里配置数据源很简单,官方网站上有详细说明。简单说把下面这段xml复制到tomcat安装目录下的conf/context.xml里就可以了:

<Resource name=”myDataSourceName” auth=”Container” type=”javax.sql.DataSource”
maxActive=”100″ maxIdle=”30″ maxWait=”10000″
username=”root” password=”" driverClassName=”com.mysql.jdbc.Driver”
url=”jdbc:mysql://localhost:3309/mydatabase” removeAbandoned=”true” removeAbandonedTimeout=”10″ logAbandoned=”false” />

上面这段Resource元素很容易理解,关键就是removeAbandoned和removeAbandonedTimeout这两个属性,它们是告诉DBCP把被遗弃的连接删掉,以及被遗弃多久才删除。hibernate就是那个常常遗弃连接的家伙。

Share/Save/Bookmark