从连接池获取数据库连接

我正在重构其他代码。我注意到的一件事是关于系统如何从连接池获取连接的方式。

样本就是这样。在每次调用服务方法时,系统都会在JNDI上针对数据源进行上下文查找。

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();

}

}

}

我确实认为每次这样做都会对性能产生影响。我正在考虑解决这些问题的另一种方法,即如何从连接池中检索连接。

我正在考虑使用servlet的init()方法,但我认为这不是最佳选择。

回答:

一次执行一次,ServletContextListener而不是每次在init()许多servlet中执行一次。contextInitialized()在webapp启动期间,该方法仅执行一次。

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()选择方法):

DataSource dataSource = Config.getInstance(getServletContext()).getDataSource();

但是,我将进一步重构它,最好将JDBC代码放在其自己的类中,而不是在servlet中。查找DAO模式。

以上是 从连接池获取数据库连接 的全部内容, 来源链接: utcz.com/qa/422111.html

回到顶部