晚上打开浏览器从服务器取图片的时候发现速度慢的惊人(没有用任何服务器端缓存),大概会延迟很长时间才打开,后来去打日志,看了下:
Sun Apr 11 20:41:20 CST 2010 [DEBUG] 2010-04-11 20:41:27 :Created connection 25706868. [DEBUG] 2010-04-11 20:41:27 :{conn-100000} Connection [DEBUG] 2010-04-11 20:41:27 :{pstm-100001} PreparedStatement: select * from cases limit ?,8 [DEBUG] 2010-04-11 20:41:27 :{pstm-100001} Parameters: [8] [DEBUG] 2010-04-11 20:41:27 :{pstm-100001} Types: [java.lang.Integer] [DEBUG] 2010-04-11 20:41:27 :{rset-100002} ResultSet
可以看出这个是由于和数据库的连接开销非常大,日志中可以看出光是连接建立就花了7秒钟,吃惊。。。看来选一个好的数据库连接池是破在眉睫的事情 了,否则这QPS也实在太高了。
ibatis本身自己就带了连接池的,而且默认就是配上的,但是我请求了很多次发现效果也不好。用ibatis做连接mysql的持久层框架。一张 页面有8张图片,这些图片存储在数据库中,所以每请求一次页面至少要访问8次数据库,依次把这8张图片取回来。下面部分服务器日志:
[DEBUG] 2010-04-11 20:45:50 :{rset-100357} Header: [Id, title, pic] [DEBUG] 2010-04-11 20:45:50 :{rset-100357} Result: [2, clock, [B@10a4d7c] [DEBUG] 2010-04-11 20:45:55 :Created connection 26137220. [DEBUG] 2010-04-11 20:45:56 :{conn-100358} Connection [DEBUG] 2010-04-11 20:45:56 :{pstm-100359} PreparedStatement: select count(*) from cases [DEBUG] 2010-04-11 20:45:56 :{pstm-100359} Parameters: [] [DEBUG] 2010-04-11 20:45:56 :{pstm-100359} Types: [] [DEBUG] 2010-04-11 20:45:56 :Returned connection 31966729 to pool. [DEBUG] 2010-04-11 20:45:56 :{rset-100360} ResultSet [DEBUG] 2010-04-11 20:45:56 :{rset-100360} Header: [count(*)] [DEBUG] 2010-04-11 20:45:56 :{rset-100360} Result: [17] [DEBUG] 2010-04-11 20:45:56 :Returned connection 4355837 to pool. [DEBUG] 2010-04-11 20:45:56 :Returned connection 4300404 to pool. [DEBUG] 2010-04-11 20:45:56 :Returned connection 21790187 to pool. [DEBUG] 2010-04-11 20:45:56 :Returned connection 23417981 to pool. [DEBUG] 2010-04-11 20:45:56 :Closed connection 26137220.
可以看出ibatis的默认连接池simple模式建立了许多连接,并且确实有了重用。但是经过使用发现效果还是不理想。
最 后发现原来是自己的连接池没有配置,使用了默认的连接池,要么就是最大连接数太少,要么就是存在时间太短,马上就close掉了,后来用dbcp并配置了 下连接池,速度大增,原来每次点一个页面就要花7秒的,现在只要第一次花7秒,后来每次点都是毫秒级的了,下面是我的配置文件:
<transactionManager type="JDBC"> <dataSource type="DBCP"> <property name="JDBC.Driver" value="com.mysql.jdbc.Driver" /> <property name="JDBC.ConnectionURL" value="jdbc:mysql://xxxxxx" /> <property name="JDBC.Username" value="root" /> <property name="JDBC.Password" value="xxxxxx" /> <property name="Pool.MaximumActiveConnections" value="15"/> <property name="Pool.MaximumIdleConnections" value="15"/> <property name="Pool.MaximumWait" value="1000"/> </dataSource> </transactionManager>
数据库连接真的非常耗时,今天才算真正的体会到了,原来都是书本上知道的,有连接池真好,呵呵。