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