欢迎来到天天文库
浏览记录
ID:30867953
大小:156.42 KB
页数:5页
时间:2019-01-03
《数据库连接池浅析-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、数据库连接池浅析-编程开发技术数据库连接池浅析木文由ImportNew・hejiani翻译自javacodegeekso欢迎加入翻译小组。转载请见文末要求。简介我从事的所有项目都用到了数据库连接池,这样做自然有它的理由。右时我们可能忘记了使用设计模式或者某种特定技术的理由,这时就值得我们反思为什么要使用它。每项技术或者每个技术决策都有它的优势和不足,如果不了解其缺点,你需要知道你失去了什么。数据库连接池生命周期数据库毎个读写操作需要一个连接。数据库连接调用流如下图:getConnectioncloseconne
2、ctApplicationijava.sql.DataSourceijava.sql.Driver1java.sql.Corinectioni调用流程为:1.应用数据层向DataSource请求数据库连接2.DataSource使用数据库Driver打开数据库连接3.创建数据库连接,打开TCPsocket4.应用读/写数据库5.如果该连接不再需耍就关闭连接6.关闭socket容易推断出打开/关闭数据库连接是开销很人的操作。PostgreSQL为每个客户端连接产生一个分离的OS进程,因此高频率地打开/关闭数据库连
3、接会使数据库管理系统压力增大。重用数据库连接最明显的原因是:-减少应用程序和数据库管理系统创建/销毁TCP连接的OSI/O开销-减少JVM对象垃圾使用连接池VS不使用连接池我们來比较一下不使用连接池方法与使用HikariCP,HikariCP可能是目前最快的连接池框架。该测试将打开和关闭1000个连接。privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(DataSourceConnectionTest.class);privatestaticfinali
4、ntMAX_ITERATTONS二1000;privateSlf4jReporterlogReporter;privateTimertimer;protectedabstractDataSourccgctDataSourcc();©Beforepublicvoidinit(){MetricRegistrymetricRegistry二newMetricRegistry();this・logReporter=Slf4jRcportcr.forRegistry(metricRegistry)・outputTo(LO
5、GGER).build();timer二metricRegistry.timer(,,connection,z);}©TestpublicvoidtestOpenCloseConnections()throwsSQLException{for(inti=0;i6、();下面的图表为打开和关闭连接花费的时间,这个时间当然越短越好。■NoPooling■ConnectionPooling使用连接池比不使用连接池快600倍。我们的金业系统包括几十个应用,一个批处理器系统仅仅能够处理每小时大于200万次数据库连接,所以2个数量级的优化是值得考虑的。TypeNoPoolingTime(milliseconds)ConnectionPoolingTime(milliseconds)min74.5514140.002633max146.69324125.528047mean78.217、65490.128900stddev5.94383353.969438median76.1504400.003218为什么连接池快很多?理解使用数据库连接池后运行如此好的原因,要分析池连接管理的调用流程:Application"T-java.sql.DataSource"T-Pool1java.sql.Corinection"T-geiL/unneciion™dCquilc~沪■■*LlUbU8、池将创建新的连接。连接池的close()方法把连接返回到连接池而不是真正地关闭它。getConnectionAAYes更快更安全连接池是即将到來的连接请求的有界缓冲区。如果出现瞬间流量尖峰,连接池会平缓这一变化,而不是使所有可用数据库资源趋于饱和。等待步骤和超时机制是安全钩子(safetyhook),防止数据库服务器过载。如果一个应用消耗太多数据库流量,为防止它将数据库服务器压垮(因此
6、();下面的图表为打开和关闭连接花费的时间,这个时间当然越短越好。■NoPooling■ConnectionPooling使用连接池比不使用连接池快600倍。我们的金业系统包括几十个应用,一个批处理器系统仅仅能够处理每小时大于200万次数据库连接,所以2个数量级的优化是值得考虑的。TypeNoPoolingTime(milliseconds)ConnectionPoolingTime(milliseconds)min74.5514140.002633max146.69324125.528047mean78.21
7、65490.128900stddev5.94383353.969438median76.1504400.003218为什么连接池快很多?理解使用数据库连接池后运行如此好的原因,要分析池连接管理的调用流程:Application"T-java.sql.DataSource"T-Pool1java.sql.Corinection"T-geiL/unneciion™dCquilc~沪■■*LlUbU8、池将创建新的连接。连接池的close()方法把连接返回到连接池而不是真正地关闭它。getConnectionAAYes更快更安全连接池是即将到來的连接请求的有界缓冲区。如果出现瞬间流量尖峰,连接池会平缓这一变化,而不是使所有可用数据库资源趋于饱和。等待步骤和超时机制是安全钩子(safetyhook),防止数据库服务器过载。如果一个应用消耗太多数据库流量,为防止它将数据库服务器压垮(因此
8、池将创建新的连接。连接池的close()方法把连接返回到连接池而不是真正地关闭它。getConnectionAAYes更快更安全连接池是即将到來的连接请求的有界缓冲区。如果出现瞬间流量尖峰,连接池会平缓这一变化,而不是使所有可用数据库资源趋于饱和。等待步骤和超时机制是安全钩子(safetyhook),防止数据库服务器过载。如果一个应用消耗太多数据库流量,为防止它将数据库服务器压垮(因此
此文档下载收益归作者所有