问题描述
我正在重构其他代码。我注意到的一件事是关于系统如何从连接池获得连接的方式。
I am refactoring others code. The one thing I notice is that of the manner on how the system is getting a connection from the connection pool.
示例是这样的。在每次调用service方法时,系统都会在JNDI上为数据源进行上下文查找。
Sample is like this. On every call of the service method, the system is making a context lookup on the JNDI for the datasource.
public class CheckinServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
//Obtain Connection
InitialContext initialContext = new InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource) initialContext
.lookup("jdbc/mysqldb");
java.sql.Connection conn = ds.getConnection();
//business logic
//redirect
} finally {
conn.close();
}
}
}
我认为有每次这样做都会影响性能。我正在考虑另外一种方法来解决如何从连接池中检索连接。
I do think that there is a performance hit on doing this every time. I am thinking of another way around these on how to retrieve a connection from a connection pool.
我正在考虑使用servlet的 init()
方法,但我认为这不是最优的。
I am thinking about using the servlet's init()
method but I think that is not optimal.
推荐答案
在每次在 init()
中的许多servlet。在webapp启动期间, contextInitialized()
方法只执行一次。
Do it once in a ServletContextListener
instead of everytime in init()
of many servlets. The contextInitialized()
method is executed only once during webapp's startup.
public class Config implements ServletContextListener {
private static final String ATTRIBUTE_NAME = "config";
private DataSource dataSource;
@Override
public void contextInitialized(ServletContextEvent event) {
ServletContext servletContext = event.getServletContext();
String databaseName = servletContext.getInitParameter("database.name");
try {
dataSource = (DataSource) new InitialContext().lookup(databaseName);
} catch (NamingException e) {
throw new RuntimeException("Config failed: datasource not found", e);
}
servletContext.setAttribute(ATTRIBUTE_NAME, this);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
// NOOP.
}
public DataSource getDataSource() {
return dataSource;
}
public static Config getInstance(ServletContext servletContext) {
return (Config) servletContext.getAttribute(ATTRIBUTE_NAME);
}
}
在中按如下方式配置web.xml
:
<context-param>
<param-name>database.name</param-name>
<param-value>jdbc/mysqldb</param-value>
</context-param>
<listener>
<listener-class>com.example.Config</listener-class>
</listener>
您可以在servlet中获取它,如下所示( init()
或 doXXX()
方法,您选择):
You can obtain it in your servlet as follows (init()
or doXXX()
method, you choose):
DataSource dataSource = Config.getInstance(getServletContext()).getDataSource();
然而,我会进一步重构它,最好将JDBC代码放在自己的类中,不在servlet中。查看DAO模式。
I'd however refactor it a step further, JDBC code should preferably be placed in its own classes, not in servlets. Lookup the DAO pattern.
这篇关于从连接池获取数据库连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!