我有一个处理发布/获取请求的主Servlet
我正在使用连接池(jdbc / mysql与glassfish v3),我的servlet代码是:
public class Controller extends HttpServlet {
private DataSource datasource;
@Override
public void init() throws ServletException {
super.init();
try {
//Database Connection pooling:
InitialContext ctx = new InitialContext();
datasource = (DataSource)ctx.lookup("jdbc/MySQLPool");
}
catch (Exception e) {
e.printStackTrace();
}
}
private Connection getConnection() throws SQLException {
return datasource.getConnection();
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Connection connection=null;
try {
connection = datasource.getConnection();
Object obj= cmdFactory.getInstance().getCommand(Cmd).execute(connection);
}
等... 并在最后一个块中的servlet末尾关闭连接
所以现在我将“connection”对象作为最后一行中的参数传递,供其他(非servlet)java类通过应用程序的较低层使用。这是错的吗?最好是传递数据源对象(然后在特定的类中执行datasource.getConnection())?或者是否有类似于“getServletContext()。getAttr(database)”的东西可以在其他java类中用来获得这个连接?
答案 0 :(得分:3)
DataSource允许获取JDBC连接(大多数时候来自连接池)。在servlet环境中,如果您要求连接到DataSource两次,您将获得两个不同的连接。
因此传递DataSource没有意义:您希望调用链中的所有对象使用相同的连接,并在最后提交。
连接必须通过从DataSource获取它的方法关闭,在finally块中,否则池将泄漏连接,并且您将很快耗尽可用连接。