JSP网站的连接池策略?
我正在编写非常糟糕的JSP网站上做一些工作。对于每个数据库调用,原始程序员打开并关闭数据库连接。我正在添加一些新的数据库操作,并且我希望做的更好一点(当更多的站点可以重建时,稍后会发生类似于休眠的事情)。我正在考虑在会话开始时(登录后)创建单个数据库连接,将其存储在会话对象中,然后在会话关闭时将其关闭到会话处理函数的会话监听器结束时。这是一个合理的策略吗?思考?JSP网站的连接池策略?
我想创建当会话开始时(在登录后),将其存储在会话对象单个数据库连接,然后当会话关闭在会话处理功能的会话监听端关闭它的。这是一个合理的策略吗?思考?
否。创建一个容器管理的连接池数据源,并在webapp的启动时通过JNDI获取它。
如何创建数据源取决于有问题的容器。例如Tomcat 6.0,你可以在这里阅读:Tomcat JNDI Resources HOW-TO - JDBC Data Sources。例如Glassfish 3,您可以在基于web的管理控制台http://localhost:4848上进行操作。
这里是如何你终于可以从JNDI获得它:
DataSource dataSource = (DataSource) new InitialContext().lookup(jndiName);
// ...
你可以调用它getConnection()
。在webapp启动期间只需要获取一次数据源就足够了,例如在数据库连接管理器的静态初始化块中,或者在ServletContextListener
中。
应始终在尽可能最短的范围内获取并关闭连接。在try
块内执行查询并将其关闭在同一个try
块的finally
中。不要将连接打开超过必要的时间。连接池将保持打开状态,所以性能已经大大提高了。
没有评论你的想法(因为我从来没有这样做过,所以我不知道肯定),我可以说我总是看到它做了这样的事情(参见接受的答案):
How to reuse the same connection with a Spring's JdbcTemplate?
对于初学者使用存储在您的ServletContext中(或JSP的说法“适用范围”)一Common DBCP's PoolingDataSource实例。
理想情况下,我会考虑迁移到Spring(或Guice或类似的)。
spring的jdbcTemplate和像dbcp这样的连接池,它都会自动发生。 – Kevin